你們仍未掌握那天所學的 git 知識

博客可能樣式更好看: http://yonghaowu.github.io/2017/06/18/TheGitYouShouldKnow/
歡迎大家的意見匾旭,謝謝:P

絕大多數人對于 git的認識只停留在git status, git add, git push, git pull, 好一點會知道git merge, 那就是全部了美浦。

不信?

試試你能回答出以下問題不:

  • git push origin master命令中喳挑,origin 代表的是什么,整個命令是什么意思滔悉,origin 可以修改不
  • git fetch origin; git rebase origin master 這些命令知道嗎伊诵?跟 merge 有什么區(qū)別?
  • git如何合并兩個補丁回官,對第三個補丁進行修改曹宴?(這個很重要,因為你不會才導致 git commit 的信息沒有意義歉提,commit 不夠小和多)

又或者笛坦,你試過合并commit 嗎?commit message 寫的不好時如何修改唯袄?如何改變 commit 的順序弯屈?

如果以上有不清楚的話,那么我希望以下的文章對你有幫助恋拷。

你所不知道的 github 初始化

初始創(chuàng)建一個 github 倉庫時资厉,github 會給一些命令你去創(chuàng)建 git本地項目,git init就不用說了蔬顾,git remote add origin git@github.com:YongHaoWu/test.git 你知道這里的 origin 是什么嗎宴偿?

是的,就僅僅是一個名字诀豁,對git@github.com:YongHaoWu/test.git 這個 ssh 地址的命名窄刘,你可以把 origin命名為 gakki —— git remote add gakki git@github.com:YongHaoWu/test.git, 以后就可以用git push gakki master了。

另外舷胜,你還可以 add好幾個名字娩践,比如:你在 github 跟coding 同樣都有倉庫放代碼的情況。

git push -u origin master , 這里就是把 master(默認 git 分支)推送到 origin, -u也就是--set-upstream, 代表的是更新?默認推送的地方翻伺,這里就是默認以后git pullgit push時材泄,都是推送和拉自 origin 。

令 commit 更漂亮

對于 git 工作流吨岭,我認為commit 數要多而有意義拉宗,branch 也要多而有意義——也就是,一個小功能就要開一個分支辣辫,一個分支里要有一些有意義的 commit旦事。 好處就是沖突會很少,review 代碼速度加快急灭,commit 都是有意義的姐浮,而且利于回退。

要做到這些化戳,離不開掌握git rebase

永遠使用 rebase
git rebase

Reapply commits from one branch on top of another branch.
Commonly used to "move" an entire branch to another base, creating copies of the commits in the new location.

相信你可以理解以上的英文:把 A 分支rebase 到 B 分支单料,也就是把 A 的 commit 與 B 的合并,并且保留 B 獨特的 commit点楼。

還是很抽象,對吧白对?

看一個例子:git pull gakki feat-add-listener 這里就是把 gakki 倉庫拉到 feat-add-listerner 分支掠廓。實際上,所做的東西等價于:

git fetch gakki          //把 gakki 倉庫的東西都拉下來本地
git rebase gakki/origin feat-add-lister //把 gakki 的 master 分支 rebase 到 feat-add-lister

因為 pull 的時候甩恼, 當出現(xiàn)沖突而你解決掉后蟀瞧,會有多余的merge信息(commit message),所以我是推薦在自己的分支開發(fā)時条摸,永遠使用 fetch悦污,rebase(不會出現(xiàn)多余信息,處理沖突更加自由)

合并你的 commits
Author: YongHao Hu <hyh@vincross.com>
Date:   Fri Dec 23 17:55:49 2016 +0800

    install skill: Fix skill pkg relative path.

commit 37f37e46a2570c0989a46f39169bba510ebdabd8
Author: YongHao Hu <hyh@vincross.com>
Date:   Fri Dec 23 10:51:09 2016 +0800

    mind: Add comments for understanding.

commit 4eb9b9743d2bdc301a0e97f73d652f67adc82b32
Author: YongHao Hu <hyh@vincross.com>
Date:   Thu Dec 22 15:00:02 2016 +0800

    skill-third-party: Add default include library.

假設你又以上三個 commit钉蒲,如何合并切端,修改呢?
git rebase -i HEAD~4 對前四個補丁就行修改顷啼,就會進入以下界面:

pick 0194373 skill-third-party: Change PKG_CONFIG_PATH and LD_LIBRARY_PATH.
pick 4eb9b97 skill-third-party: Add default include library.
pick 37f37e4 mind: Add comments for understanding.
pick 84c413a install skill: Fix skill pkg relative path.

# Rebase 986e234..84c413a onto 986e234 (4 commands)
#
# 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
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

有以下常用操作:

  • 默認pick踏枣, 不做更改
  • reword:改 commit message
  • squash:當前補丁跟上一個補丁合并
  • fixup: 跟 squash 作用一樣,但是會丟棄當前 commit 信息钙蒙,使用上一個的茵瀑;squash 則是可以讓你重新寫

需要修改時,把上面四個補丁最前面的 pick 改成對應操作(如 reword躬厌,fixup)马昨,然后保存退出即可。

不用擔心的回退

回退大家應該都知道git reset --hard commitID, 把整個 git 回退到這個 commitID 里;

其實除了--hard, 還有 soft.

hard是把改動全部都丟棄鸿捧,而soft則柔軟一些屹篓,僅僅是把所做的 commit 丟掉,而改動都保留在本地——通常用來修改笛谦,再重新 commit 一遍抱虐。

做了胡亂的更改,導致 git log都不正常饥脑,找不回那個 commit 了怎么辦恳邀?

不用擔心, 還有 git reflogReference logs, or "reflogs", record when the tips of branches and other references were updated in the local repository.

用它可以看到你對當前項目所做過的所有 git 操作灶轰,所有 git 操作的 id 號——意味著你可以回退到任意的時刻谣沸。

所以,只要你沒有把改動沒有做 commit 就丟失笋颤,又或者用git push -f把 github 倉庫覆蓋了乳附,你就可以恢復任意時刻的東西。

git stash 暫存更改

時刻要注意伴澄,當前修改沒有 commit 的時候赋除,不能 checkout 切換分支。

此時不想 commit非凌,便需要 git stash 暫存更改举农;顧名思義,stash 使用 stack(棧)實現(xiàn)敞嗡,所以可以 git stash存多次颁糟,然后切換分支后, git stash pop 撤出來

比 grep 更好用的 git grep

相比于 grep -R keyword ./ , 我是更喜歡用 git grep keyword, 差不多是一樣的喉悴,不過git grep只是會找當前的 目錄中git 有 track(跟蹤)的文件【也就是變動時棱貌,git status 會檢測到變化的文件】

超級進階:分割commit

 commit 03bb9a14f5ea00d51d2edc14587b37b1ab9ccf5d
Author: YongHao Hu christopherwuy@gmail.com
Date: Fri Jul 10 17:23:02 2015 +0800

msvcp110: Add tr2_sys__Unlink implementation and test.

commit 24137cd93c783ced61ca152cb4384287e6859ba4
Author: YongHao Hu christopherwuy@gmail.com
Date: Tue Jul 7 11:04:25 2015 +0800

msvcp110: Add tr2_sys__Symlink implementation and test.

commit 51702048d9ecd1dc3887a63c057761a8547ce5f6
Author: YongHao Hu christopherwuy@gmail.com
Date: Thu Jul 2 23:23:51 2015 +0800

msvcp110: Add tr2_sys__Link implementation and test.

假設我們想要分割 msvcp110: Add tr2_sys__Unlink implementation and test. 這個 commit,可以直接使用
git rebase -i HEAD~7(數字隨意箕肃,反正在 Unlink 這個 commit 前就可以了)婚脱,選擇 Unlink 這個 commit,
改成 edit突雪。
一般情況下起惕,就是這樣修改 commit 的,修改后再 git rebase –continue.

但是咏删,我們需要的是分割補度窍搿:
選擇 git rebase HEAD^, 撤銷這次 commit,再把想改動的文件 git add, 再 git commit, 這樣就可以分割很多補丁督函。

最后嘀粱,git rebase –continue 就可以了激挪。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锋叨,隨后出現(xiàn)的幾起案子垄分,更是在濱河造成了極大的恐慌,老刑警劉巖娃磺,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件薄湿,死亡現(xiàn)場離奇詭異,居然都是意外死亡偷卧,警方通過查閱死者的電腦和手機豺瘤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來听诸,“玉大人坐求,你說我怎么就攤上這事∩卫妫” “怎么了桥嗤?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長仔蝌。 經常有香客問我泛领,道長,這世上最難降的妖魔是什么敛惊? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任师逸,我火速辦了婚禮,結果婚禮上豆混,老公的妹妹穿的比我還像新娘。我一直安慰自己动知,他們只是感情好皿伺,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盒粮,像睡著了一般鸵鸥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丹皱,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天妒穴,我揣著相機與錄音,去河邊找鬼摊崭。 笑死讼油,一個胖子當著我的面吹牛,可吹牛的內容都是我干的呢簸。 我是一名探鬼主播矮台,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼乏屯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瘦赫?” 一聲冷哼從身側響起辰晕,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎确虱,沒想到半個月后含友,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡校辩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年窘问,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片召川。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡南缓,死狀恐怖,靈堂內的尸體忽然破棺而出荧呐,到底是詐尸還是另有隱情汉形,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布倍阐,位于F島的核電站概疆,受9級特大地震影響,放射性物質發(fā)生泄漏峰搪。R本人自食惡果不足惜岔冀,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望概耻。 院中可真熱鬧使套,春花似錦、人聲如沸鞠柄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厌杜。三九已至奉呛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間夯尽,已是汗流浹背瞧壮。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留匙握,地道東北人咆槽。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像肺孤,于是被迫代替她去往敵國和親罗晕。 傳聞我的和親對象是個殘疾皇子济欢,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容

  • git常用命令 GIT常用命令備忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章閱讀 8,486評論 1 26
  • 1. GIT命令 git init在本地新建一個repo,進入一個項目目錄小渊,執(zhí)行git init法褥,會初始化一個re...
    江邊一蓑煙閱讀 800評論 0 0
  • 中午花1個小時的時間去看電視,不是沒時間學英語嗎酬屉?去掉那些無意義的不創(chuàng)造價值的環(huán)節(jié)半等。
    程本超閱讀 100評論 0 0
  • 常見錯誤 org.springframework.beans.factory.BeanCreationExcept...
    孔祥子看天下閱讀 1,254評論 0 0
  • 8月2日杀饵,我的一天之回到孩童時代的瘋狂∶粒——心情筆錄切距。 我想起這件事還是多虧了我媽,要不是他惨远,我估計把這些事情都忘...
    Sernedipity閱讀 217評論 0 0