Git工作流指南(一)

一、集中式工作流

有兩個開發(fā)者小明和小紅,看他們是如何開發(fā)自己的功能并用git工作流來協(xié)作的

有人先初始化好中央倉庫

所有人克隆(fork)中央倉庫

下一步,各個開發(fā)者通過git clone命令創(chuàng)建整個項目的本地拷貝

小明開發(fā)功能

在小明的本地倉庫中,他使用標準的Git過程開發(fā)功能:編輯、暫存(Stage)和提交。

git status # 查看本地倉庫的修改狀態(tài)
git add # 暫存文件
git commit # 提交文件
git diff #查看本地的所有修改
git checkout file/. ##撤銷文件更改

這些命令生成的是本地提交,小明可以按自己需求反復(fù)操作多次,而不用擔(dān)心中央倉庫上有了什么操作。

小紅開發(fā)功能

與此同時,小紅在自己的本地倉庫中用相同的編輯、暫存和提交過程開發(fā)功能。和小明一樣,她也不關(guān)心中央倉庫有沒有新提交; 當(dāng)然更不關(guān)心小明在他的本地倉庫中的操作,因為所有本地倉庫都是私有的。

小明發(fā)布功能

一旦小明完成了他的功能開發(fā),會發(fā)布他的本地提交到中央倉庫中,這樣其它團隊成員可以看到他的修改。他可以用下面的[git push命令]:
git push origin master

注意,origin是在小明克隆倉庫時Git創(chuàng)建的遠程中央倉庫別名。master參數(shù)告訴Git推送的分支。 由于中央倉庫自從小明克隆以來還沒有被更新過,所以push操作不會有沖突,成功完成。

小紅試著發(fā)布功能

一起來看看在小明發(fā)布修改后,小紅push修改會怎么樣?她使用完全一樣的push
命令:
git push origin master

但她的本地歷史已經(jīng)和中央倉庫有分岐了,Git拒絕操作并給出下面很長的出錯消息:

error: failed to push some refs to '/path/to/repo.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

這避免了小紅覆寫正式的提交。她要先pull小明的更新到她的本地倉庫合并上她的本地修改后,再重試。

小紅在小明的提交之上rebase

小紅用[git pull]合并上游的修改到自己的倉庫中。 ——拉取所有上游提交命令到小紅的本地倉庫,并嘗試和她的本地修改合并:
git pull --rebase origin master

--rebase選項告訴Git把小紅的提交移到同步了中央倉庫修改后的master分支的頂部,如下圖所示:

如果你忘加了這個選項,pull操作仍然可以完成,但每次pull操作要同步中央倉庫中別人修改時,提交歷史會以一個多余的『合并提交』結(jié)尾。 對于集中式工作流,最好是使用rebase而不是生成一個合并提交。

小紅解決合并沖突

rebase操作過程是把本地提交一次一個地遷移到更新了的中央倉庫master分支之上。 這意味著可能要解決在遷移某個提交時出現(xiàn)的合并沖突,而不是解決包含了所有提交的大型合并時所出現(xiàn)的沖突。 這樣的方式讓你盡可能保持每個提交的聚焦和項目歷史的整潔。反過來,簡化了哪里引入Bug的分析,如果有必要,回滾修改也可以做到對項目影響最小。

如果小紅和小明的功能是不相關(guān)的,不大可能在rebase過程中有沖突。如果有,Git
在合并有沖突的提交處暫停rebase過程,輸出下面的信息并帶上相關(guān)的指令:

CONFLICT (content): Merge conflict in <some-file>

Git很贊的一點是,任何人可以解決他自己的沖突。在這個例子中,小紅可以簡單的運行[git status]命令來查看哪里有問題。 沖突文件列在Unmerged paths(未合并路徑)一節(jié)中:

Unmerged paths:
(use "git reset HEAD <some-file>..." to unstage)
(use "git add/rm <some-file>..." as appropriate to mark resolution)

both modified: <some-file>

接著小紅編輯這些文件。修改完成后,用老套路暫存這些文件,并讓[git rebase
]完成剩下的事:
git add <some-file> git rebase --continue

要做的就這些了。Git會繼續(xù)一個一個地合并后面的提交,如其它的提交有沖突就重復(fù)這個過程。
如果你碰到了沖突,但發(fā)現(xiàn)搞不定,不要驚慌。只要執(zhí)行下面這條命令,就可以回到你執(zhí)行[git pull --rebase]命令前的樣子:
git rebase --abort

小紅成功發(fā)布功能

小紅完成和中央倉庫的同步后,就能成功發(fā)布她的修改了:
git push origin master

更多請查看my-git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 多種多樣的工作流使得在項目中實施Git時變得難以選擇。這份教程提供了一個出發(fā)點,調(diào)查企業(yè)團隊最常見的Git工作流。...
    JSErik閱讀 4,609評論 2 8
  • 集中式工作流 每個開發(fā)可以有屬于自己的整個工程的本地拷貝。隔離的環(huán)境讓各個開發(fā)者的工作和項目的其他部分(修改)獨立...
    yohn閱讀 540評論 0 0
  • 《舍得,靜心》—穿石—如雞肋也、食之無肉、棄之余味、食欲蹶也。當(dāng)沉其心、靜于達、起于安、發(fā)于將、思其往、通乎哉、變...
    東方詩空閱讀 451評論 0 0
  • 2016年下半年,對于我來說,是一個全新開始的一年。 換了新的工作,到了新的崗位,并在此之后的每一天,都在以一顆保...
    豆媽不逗閱讀 694評論 0 0

友情鏈接更多精彩內(nèi)容