本文内容来自对廖雪峰老师Git教程总结。
创建版本库
初始化一个Git仓库,使用git init
命令。
- 第一步,使用命令
git add
。 - 第二步,使用命令
git commit -m "xx"
,完成。
版本回退
HEAD
指向的版本就是当前的版本。使用命令git reset --hard commit_id
。
回到上个版本git reset --hard HEAD^
。
回到上上个版本HEAD^^
。
回到往上10个版本HEAD~10
。
- 穿梭前,用
git log
可以查看提交历史。 - 重返未来,用
git reflog
查看命令历史。
撤销修改
可以使用git reset HEAD
把暂存区的修改撤销掉,重新放回工作区。
再次使用git checkout --
丢弃工作区的修改。
删除文件
但是,你发现你删错了,可以使用:git checkout -- file
来恢复工作区。
如果你要真的删除可以使用git rm file
然后提交修改就好了。
git rm file
是同时删除工作区的文件,并将删除的动作提交到暂存区。
添加远程仓库
要关联一个远程库,使用命令git remote add origin git@github.com:账户/仓库名称.git
。
第一次用git push -u origin master
命令推送master分支的所有内容。
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master
推送最新修改。
创建和合并分支
master
分支是一条线,Git用master
指向最新的提交,再用HEAD
执行master
,就能确定当前分支,以及当前分支的提交点。
当我们创建新的分支,例如dev
时,Git新建了一个指针叫dev
,指向master
相同的提交,再把HEAD
指向dev
,就表示当前分支在dev
上:
- 查看分支:
git branch
- 创建分支:
git branch
- 切换分支:
git checkout
- 创建+切换分支:
git checkout -b
- 合并某分支到当前分支:
git merge
- 删除分支:
git branch -d
分支冲突解决
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> dev
当发生冲突时,Git会用这样的方式标记处不同分支的内容,我们只需要修改后重新提交即可。
使用带参数的git log
可以看到分支的合并情况:
通常,Git会用Fast forward
模式,但在这种模式下,删除分之后,会丢掉分支信息。
如果要强制禁用Fast forward
模式,Git就会在merge
时生成一个新的commit
,这样,从分支历史上就可以看出分支信息。
$ git merge --no-ff -m "merge with no-ff" dev
可以看到HEAD
已经不是切换指针而是有了一个新的版本。
bug分支
当项目发现了bug我们可以创建一个bug分支,修复完成后合并分支,然后将临时分支删除。
但是正在dev上进行的工作还没有提交...
你可以使用git stash
将当前的工作现场“储藏”起来,等以后恢复现场后继续工作。(储藏之前你要保证将新的内容已经加到了缓存区了,也就是执行了git add
指令。)
查看工作现场:
$ git stash list
使用git stash pop
恢复的同时删除stash内容。
多人协作
多人协作的工作模式通常是这样:
首先,可以试图用git push origin branch-name
推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull
试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin branch-name
推送就能成功!
如果git pull
提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name
。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
标签管理
使用git tag
创建标签
$ git tag v1.0
可以使用命令git tag
查看所有标签
$ git tag
为之前的版本打上标签
$ git tag
$ git tag -d v1.0
如果推送某个标签到远程,使用命令git push origin
或者一次性推送全部尚未推送到远程的本地标签:
$ git push origin --tags
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
$ git tag -d v0.9
$ git push origin :refs/tags/v0.9