bisect git 使用_Git使用过程中的一些常见场景问题总结
之前在公司內(nèi)部推Git,寫(xiě)了一份git使用教程,后來(lái)又在團(tuán)隊(duì)內(nèi)部做了一次分享,內(nèi)容是關(guān)于Git使用過(guò)程中經(jīng)常會(huì)遇到的一些場(chǎng)景,并有了這份總結(jié)。
git基礎(chǔ)
基于feature的工作流
添加忽略文件 .gitignore (http://gitignore.io/)
基于develop分支開(kāi)發(fā):feature分支 bugfix分支 版本節(jié)點(diǎn)tag
問(wèn)題排查: diff 、log 、reflog、blame
撤銷(xiāo)操作: checkout 、reset、revert、commit --amend
刪除操作: rm clean
儲(chǔ)藏操作: stash
分支操作:創(chuàng)建、刪除(注意遠(yuǎn)程分支的刪除)、切換、合并(--no-ff 、rebase)
標(biāo)簽操作
更多詳細(xì)查看上面教程鏈接
場(chǎng)景
1. 本地已經(jīng)存在的項(xiàng)目/分支與如何遠(yuǎn)程倉(cāng)庫(kù)關(guān)聯(lián)
git remote add origin
2. 剛剛提交了的commit log發(fā)現(xiàn)錯(cuò)了,想修改
git commit --amend -m "your new log"
3. 查看某次提交的日志和ID
git reflog
4. 查看某次提交的內(nèi)容
git show
5. 只是修改了工作區(qū)的文件,想恢復(fù)到原來(lái)修改前的樣子
git reset --hard HEAD
git checkout --
6. 被修改的文件已經(jīng)添加到了暫存區(qū),想撤銷(xiāo)添加
git reset --mixed HEAD
7. 被修改的文件已經(jīng)commit提交,想撤銷(xiāo)提交
git reset --soft HEAD^
8. 已經(jīng)提交到遠(yuǎn)程主機(jī)的文件,想撤銷(xiāo)
git revert
git revert HEAD
9. 已經(jīng)開(kāi)發(fā)一半的功能,但是沒(méi)有開(kāi)發(fā)完,這時(shí)候有個(gè)bug要緊急處理,需要放下手頭的功能,趕去修改BUG
// 保存現(xiàn)場(chǎng)
git stash
// 恢復(fù)現(xiàn)場(chǎng)
git stash pop
10. 加入過(guò)歷史版本的文件,因某些原因被刪除了想恢復(fù)
git checkout --
另外你也可以用reset命令來(lái)完成
11. 需要單獨(dú)把多次提交中的某一次提交從你的分支遷移到另外一個(gè)分支上,即跨分支應(yīng)用commit
git cherry-pick
比如:我想把以下分支
A-B master
\
C-D-E-F-G develop
中的D,F 兩次提交移動(dòng)到master分支,而保持其他commit不變,結(jié)果就像這樣
A-B-D-F master
\
C-E-G develop
那么,思路是將D,F 用cherry-pick應(yīng)用到master分支上,然后將develop分支對(duì)master分支變基。
$ git checkout master
$ git cherry-pick D
$ git cherry-pick F
$ git checkout develop
$ git rebase master
注意有些情況下使用cherry-pick會(huì)存在沖突,解決方法和我們平時(shí)合并分支遇到?jīng)_突一樣。
12. 遇到文件沖突,可以手動(dòng)解決,或者用你配置的工具解決,記得把文件標(biāo)位resolved:add/rm
如:常見(jiàn)的拉取同事的代碼合并引起沖突
1. 手動(dòng)處理沖突
2. 文件標(biāo)志位置為resolved:git add
3. 繼續(xù)合并 git merge --continue
當(dāng)然也可以選擇放棄合并:git merge --abort
13. 讓自己本地分支上面的每一次提交日志變得更有意義,有時(shí)候需要我們選擇有意義的提交日志信息合并上去
比如我們?cè)赽ugfix分支上面由于修改bug提交了很多次,修復(fù)好了之后,我們想把這些提交合并入我們的master分支
git checkout master
git merge --squash bugfix
git commit -m "bug fixed"
上面操作會(huì)將bugfix分支上的所有commit都合并為一個(gè)commit,并把它并入我們的master分支上去。這里還有一點(diǎn)需要注意的是:--squash含義代表的是本地內(nèi)容與不使用該選項(xiàng)的合并結(jié)果相同,但是不提交,不移動(dòng)HEAD指針,所以我們要另外多一條語(yǔ)句來(lái)移動(dòng)我們的HEAD指針,即最后的commit。
14. 有時(shí)候需要整理我們本地的commits,可以使用Squash
git rebase -i
舉例:
git rebase -i HEAD~5
執(zhí)行完后,Git會(huì)把所有commit列出來(lái),讓你進(jìn)行一些修改,修改完成之后會(huì)根據(jù)你的修改來(lái)rebase。HEAD-5的意思是只修改最近的5個(gè)commit。
pick 033beb4 b1
pick b426a8a b2
pick c216era b3
pick d627c9a b4
pick e416c8b b5
# Rebase 033beb4..e416c8b onto 033beb4
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
上面pick是要執(zhí)行的commit指令,另外還有reword、edit、squash、fixup、exec這5個(gè),具體的含義可以看上面的注釋解釋,比較簡(jiǎn)單,這里就不說(shuō)了。
我們要合并就需要修改前面的pick指令:
pick 033beb4 b1
squash b426a8a b2
squash c216era b3
squash d627c9a b4
squash e416c8b b5
也就是下面這4個(gè)提交合并到最前面的那個(gè)提交里面,按esc,打上:wq提交保存離開(kāi)。
接著是輸入新的commit message
b
# This is a combination of 2 commits.
# The first commit's message is:
# b1
#
# This is the 2nd commit message:
#
# b2
#
# This is the 3rd commit message:
#
# b3
#
# This is the 4th commit message:
#
# b4
#
# This is the 5th commit message:
#
# b5
#
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# Not currently on any branch.
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# modified: a.txt
#
其中第一行的b就是需要我們輸入的新信息,同樣編輯完保存,出現(xiàn)類(lèi)似下面的信息:
Successfully rebased and updated refs/heads/develop.
最后可以用git log指令來(lái)驗(yàn)證commits是不是我們要變成的樣子。
15. 多人協(xié)作開(kāi)發(fā)項(xiàng)目,想知道某個(gè)文件的當(dāng)前改動(dòng)情況
通常查問(wèn)題時(shí)想知道某個(gè)文件的某部分代碼是誰(shuí)改動(dòng)的,那么git blame 就派上用場(chǎng)了。
git blame
你也可以具體指定到某一行或者某幾行代碼
git blame -L ,
16. 執(zhí)行push命令向多個(gè)倉(cāng)庫(kù)同時(shí)提交代碼
有時(shí)候會(huì)做代碼備份,將代碼保存在幾個(gè)不同的Git代碼管理平臺(tái),這時(shí)候就需要用到了
修改本地倉(cāng)庫(kù)目錄下.git/config文件
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = git@github.com:yuxingxin/blog.git
url = ……
url = ……
fetch = +refs/heads/*:refs/remotes/origin/*
如上 在remote處可以添加多個(gè)遠(yuǎn)程地址。
17. 從多次提交中快速定位某一次提交的bug
# 開(kāi)始 bisect
$ git bisect start
# 錄入正確的 commit
$ git bisect good xxxxxx
# 錄入出錯(cuò)的 commit
$ git bisect bad xxxxxx
# 然后 git 開(kāi)始在出錯(cuò)的 commit 與正確的 commit 之間開(kāi)始二分查找,這個(gè)過(guò)程中你需要不斷的驗(yàn)證你的應(yīng)用是否正常
$ git bisect bad
$ git bisect good
$ git bisect good
...
# 直到定位到出錯(cuò)的 commit,退出 bisect
$ git bisect reset
總結(jié)
當(dāng)然了,git的一些常見(jiàn)場(chǎng)景,還遠(yuǎn)不止這些,限于本人能力有限,如果你在平時(shí)的工作中遇到一些很實(shí)用的命令,也歡迎反饋給我,我好一并學(xué)習(xí)。更多的詳細(xì)可以參考之前總結(jié)的一系列文檔: https://devops.yuxingxin.com。 學(xué)習(xí)git命令是一件很有意思的事情,我想它能幫助使用git命令的人更好的理解這一代碼管理工具,從而不至于犯一些低級(jí)錯(cuò)誤,MobDevGroup網(wǎng)站上面也分享過(guò)幾個(gè)學(xué)習(xí)命令的網(wǎng)站,可以供參考:https://mobdevgroup.com/tools/assistant
總結(jié)
以上是生活随笔為你收集整理的bisect git 使用_Git使用过程中的一些常见场景问题总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: typescript的类型描述_一文学懂
- 下一篇: android 收获地址管理,andro