举个反例:前端
举个正例:git
经过 git status
查看shell
git diff --staged
或 git diff --cached
可查看已暂存文件和上次提交的区别缓存
合理使用分支,分支的好处:bash
tag 的做用是对某个提交点打上标签,发布版本后打 tag,便于之后回滚特定版本,而不须要 revert。markdown
tag 是对某一版本的记录。测试
git pull --rebase
和开发步骤相似this
git rebase
通常解释为变基
,也有解释为衍合
。spa
git merge
和 git rebase
均可以整合两个分支的内容,最终结果没有任何区别,可是变基使得提交历史更加整洁。命令行
例如如今 dev 提交了一次,master 在此以后也提交了一次,两个分支的状态以下:
git merge
的结果:
git rebase
的结果:
git merge
后,提交点的顺序都和提交的时间顺序相同,即 master 的提交在 dev 以后。git rebase
后,顺序变成被rebase
的分支(master)全部提交都在前面,进行rebase
的分支(dev)提交都在被rebase
的分支以后,在同一分支上的提交点仍按时间顺序排列。假设场景:从 dev 拉出分支 feature-a。那么当 dev 要合并 feature-a 的内容时,使用 git merge feature-a
;反过来当 feature-a 要更新 dev 的内容时,使用 git rebase dev
。
使用时主要看两个分支的"主副"关系。
通常来讲,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
!
————————————————————
--no-ff
是不快速合并的意思
git merge
的结果:
被merge的分支和当前分支在图形上并为一条线,被merge的提交点逐一合并到当前分支。
git merge --no-ff
的结果:
被merge的分支和当前分支不在一条线上,被merge的提交点还在原来的分支上,同时在当前分支上产生一个新的提交点。
————————————————————
用于整理提交和提交信息,貌似不太好用,看演示:
git rebase -i dev
后进入以下界面。
1 pick ffc75a4 修改 2 pick 6c2217f bbb 3 pick a615960 修改a 1 4 pick e4817b3 修改a 2 5 pick 8550690 修改a 3 6 7 # Rebase 3190ea4..8550690 onto 3190ea4 (5 command(s)) 8 # 9 # Commands: 10 # p, pick = use commit 11 # r, reword = use commit, but edit the commit message 12 # e, edit = use commit, but stop for amending 13 # s, squash = use commit, but meld into previous commit 14 # f, fixup = like "squash", but discard this commit's log message 15 # x, exec = run command (the rest of the line) using shell 16 # d, drop = remove commit 17 # 18 # These lines can be re-ordered; they are executed from top to bottom. 19 # 20 # If you remove a line here THAT COMMIT WILL BE LOST. 21 # 22 # However, if you remove everything, the rebase will be aborted. 23 # 24 # Note that empty commits are commented out 复制代码
修改commit注释前面的pick
,达到合并提交的目的,其中r
是保留提交,修改提交信息,f
是保留提交可是丢弃此次提交信息。
1 r ffc75a4 修改
2 f 6c2217f bbb
3 r a615960 修改a 1
4 f e4817b3 修改a 2
5 f 8550690 修改a 3
复制代码
而后进入编辑两个打了r
的提交信息的界面,修改提交信息保存便可。
这时候再看log,刚才的5次提交已经变成2次提交。
commit 94784f0c163bc4b2970f73066c91fac16b64be32
Author: ***
Date: Mon Jan 8 17:01:57 2018 +0800
修改a
commit 52907b261821afb0c38754ba95545ff8826910db
Author: ***
Date: Mon Jan 8 16:28:05 2018 +0800
修改b
复制代码
————————————————————
在通常状况下,加与不加 --rebase
是没有区别的。
然而,从上面说的 git rebase
功能得知,某个分支可能与其远程分支发生分离,而当你 pull
时使用 git pull
,则会变成你的本地分支和远程分支合并。
正确的作法是git pull --rebase
,才会拉取到最新的分支。
所以推荐在任什么时候候 pull
远程分支,最好加上 --rebase
参数。
————————————————————
git reset
修改 HEAD 指向的位置git revert
还原某一个提交,并产生新提交来记录本次还原git reset HEAD {filename}
: 取消暂存文件,恢复到已修改未暂存状态。
git reset HEAD~{n}
: 表示回退到n
个提交以前。它也能够用来合并提交,下面的写法与 git commit --amend
结果是同样的。
git reset HEAD~1
git commit
复制代码
git reset {version}
: 后面带版本号,直接回退到指定版本。
git reset的三种参数
:
--hard
,暂存区、工做区和 HEAD 指向的目录树内容相同。--soft
,只更改 HEAD 的指向,暂存区和工做区不变。--mixed
或者不带参数(默认为--mixed
),更改引用的指向及重置暂存区,可是不改变工做区。————————————————————
查看提交记录的命令是git log
,而git reflog
的功能是查看本地操做记录,能够看到本地的commit
, merge
, rebase
等操做记录,并带有版本号。
b3bf634 HEAD@{0}: rebase -i (finish): returning to refs/heads/feature-rebase-i b3bf634 HEAD@{1}: rebase -i (fixup): 完善a中的判断和输出 dd19de3 HEAD@{2}: rebase -i (fixup): # This is a combination of 2 commits. c138acf HEAD@{3}: rebase -i (reword): 完善a中的判断和输出 a7f47b2 HEAD@{5}: rebase -i (start): checkout dev a472934 HEAD@{6}: rebase: aborting a7f47b2 HEAD@{7}: rebase -i (start): checkout dev a472934 HEAD@{8}: commit: 添加a输出 c84d5b7 HEAD@{9}: commit: 添加a中的判断 a5a6e64 HEAD@{10}: commit: 修改a内容 a7f47b2 HEAD@{11}: checkout: moving from dev to feature-rebase-i 复制代码
————————————————————
把工做区内容缓存到一个栈里,以后用 git stash pop
取出。在未提交工做区内容,可是想切到其余分支时很是有用。
不建议同一时间段在不一样分支都使用 git stash
,涉及到多个分支的情形仍是先 commit 较好,不push到远程,下次 commit 时可用 --amend
合到上次提交中。
做者:丁香园前端团队——lwenn