当你在某个分支进行修改但还没完成全部修改,这时想切换到其余分支上进行一些工做,而你又不想提交进行了一半的工做,那就可使用 git stash
命令。
下次想切换回这个分支继续前面的工做时,用 git stash pop
把储藏的内容取出便可。git
git stash
会把内容推到栈上,而 git stash pop
将内容从栈上推出。因此不管进行几回的 git stash
,取出内容时都遵循“先进后出”的原则哈。git commit --amend
最多见的用法是上次提交信息写错,或提交文件多了或漏了之时,从新提交覆盖上一次提交。shell
其实它还有一个用法,就是用来合并提交。例如上次提交的修改并不彻底,再做修改以后能够用该命令把本次提交与上次提交合并在一块儿。bash
在须要回滚一次或屡次提交时,能够用git reset
。因为该命令比较危险,建议用于已经把最新提交推到远程仓库上的本地分支。工具
把已在暂时区的文件取消,恢复到已修改未暂存状态。spa
git reset
后面可带参数HEAD~[n]
(n >= 1)。表示回退到n
个提交以前。同时,它也能够用来合并提交。下面的写法与git commit --amend
结果是同样的。命令行
git reset HEAD~1
git commit复制代码
下面的用法则是合并了屡次提交code
git reset HEAD~2
git commit复制代码
git reset
后面也能够带版本号,直接回退到指定版本。cdn
git reset的三种参数blog
--hard
,如git reset --hard [version]
会执行如下操做:
--soft
,如 git reset --soft [version]
会执行上述的操做a。即只更改引用的指向,不改变暂存区和工做区。--mixed
或者不使用参数(默认为--mixed
),如 git reset [version]
会执行上述的操做a和b。即更改引用的指向及重置暂存区,可是不改变工做区。--no-ff
是不快速合并的意思rem
git merge
的结果:
被merge的分支和当前分支在图形上并为一条线,被merge的提交点逐一合并到当前分支。
git merge --no-ff
的结果:
被merge的分支和当前分支不在一条线上,被merge的提交点还在原来的分支上,同时在当前分支上产生一个合并点。这样在回滚时很是方便,版本树也很清晰。
git rebase
通常解释为变基
,也有解释为衍合
,我的以为变基
比较容易理解。
git merge
是把两个分支的代码合并到一块儿,其实git rebase
也是相同的做用,可是表现上是两种不一样的形式。
例如如今 dev 提交了一次,master 在此以后也提交了一次,两个分支的状态以下:
能够看出git merge
后,不管加不加--no-ff
参数,提交点的顺序都和提交的时间顺序相同,即 master 的提交在 dev 以后,如图:
而git rebase
后,顺序就变成被rebase
的分支(master)全部提交都在前面,进行rebase
的分支(dev)提交都在被rebase
的分支以后,在同一分支上的提交点仍按时间顺序排列,如图:
从上面的图能够看出,dev 在rebase
master 后,分支发生了变化,本来是两个分支,rebase
的结果看起来是: dev 是基于 master 的分支,且产生了一些新提交。
通常来讲,rebase
后的 dev 和远程的origin/dev
会发生分离,在命令行界面中会提示:
Your branch and 'origin/dev' have diverged,
and have 1 and 1 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)复制代码
这时须要用git push -f
强制推送,覆盖远程分支。若使用了提示中的git pull
,结果会变成合并,并产生一个合并提交点。
注:慎用git push -f
!
注意git pull
时请加上--rebase
,理由下面会说。
在通常状况下,加与不加--rebase
是没有区别的。然而,结合上面说的git rebase
功能,能够知道某个分支可能与其远程分支发生分离,而当你pull
时,你的本地分支仍是和原来的远程分支同样,这时若是使用git pull
,则会变成你的本地分支和远程分支合并,正确的作法是git pull --rebase
,才会拉取到最新的分支。
因此推荐在任什么时候候pull
远程分支,最好加上--rebase
参数。
查看提交记录的命令是git log
,而git reflog
的功能是查看本地操做记录,如此一来能够看到本地的commit
, merge
, rebase
等操做记录。
6fe46ab HEAD@{0}: rebase finished: returning to refs/heads/dev
6fe46ab HEAD@{1}: rebase: dev modify a
2c92bcb HEAD@{2}: rebase: checkout master
9b26f5d HEAD@{3}: reset: moving to 9b26f5db1e8597b884c45114fbbff36c440da274
5531fc0 HEAD@{4}: merge master: Merge made by the 'recursive' strategy.
9b26f5d HEAD@{5}: checkout: moving from master to dev复制代码