2014-11-06 44 views
4

我們使用Feature Branch Workflow,基本上是我們創建分支機構的中央存儲庫。當我們在錯誤修正和小片的工作,我們將創建一個分支關老爺的:爲什麼我們的Git存儲庫中缺少代碼,是否可以通過rebase解決?

git checkout master 
git pull 
git merge master_bug123 
git branch -d master_bug123 

git checkout -b master_bug123 master 

當我們正在與我們進行提交,我們下面將其在合併回

有時我們有大項目,我們需要所有的工作。例如,使得響應網站:

git checkout -b responsive master 
git push -u origin responsive 

團隊然後其他成員可以提出自己的特性分支像大師:

git pull 
git checkout -b responsive_fixmenu responsive 

目前,我們在這裏工作,然後到合併更改以供其他人使用:

git checkout responsive 
git pull 
git merge responsive_fixmenu 
# possibly fix conflicts, add, commit, etc 
git push -u origin responsive 

有時我們發現代碼正在丟失。我最初的想法是,這可能歸咎於我們其中一人錯誤地解決衝突。但在調查時,我有點困惑。一個名爲core.js的文件丟失了大量的代碼。在文件中包含一個字符串mb-search,我想我可以用它作爲git showgrep的一部分,以查看它何時出現並被刪除。使用git log core.js我給了一個提交列表,然後我使用該列表來執行諸如git show abc1234:path/to/core.js | grep -c 'mb-search'之類的操作,以輸出該文件中出現該提交的次數,但是顯示給我的不是簡單的0,0,0,1 ,1,1,甚至是0,0,1,1,0(它指出它被錯誤地刪除了),而是一個非常隨機的0,0,1,0,1,0,0,1等等

這將我帶到我的問題的第一部分。難道我說得對,如果另一個用戶走來,並進行了更改,使得提交(姑且稱之爲abc1111),然後做了git pull(在其他合併推動變化),它創建了一個合併提交(姑且稱之爲abc2222 - 其中MB-搜索已經合併了),然後提交abc1111包含mb-search代碼,後來合併與abc2222,它一直推後?如果是這樣,如何可靠地判斷某些代碼是否被刪除?

這導致我到rebase。在我們以與master分支相同的方式使用responsive分支之前,我們只是直接對responsive進行更改,提交和推送。當時我們默認使用rebase。在這一點上,我們發現我們遇到了很多問題,因爲我相信這是可以預料的。作爲使用git的初學者,試圖掌握基本知識,我們決定只使用merge而不是rebase,我們認爲我們沒有問題。但是現在我看到了上述問題,我想知道是否可以通過使用rebase來解決上述問題,但只能在特定條件下解決(至少可以解決上述問題)。

我認爲在我們對主要responsive存儲庫進行重新定義之前,所有提交都到處都是,代碼缺失等,一般來說,你期望從尚未正確掌握rebase規則的人那裏得到什麼。但是,這將是合法使用rebase,並且安全嗎?

git checkout -b responsive_somefeature responsive 
# write code, make commits 
git pull --rebase responsive 
git checkout responsive 
git merge responsive_somefeature 

我說得對不對地說,這將基地responsive_somefeature所有我的新作品上的responsiveHEAD,這樣,當我把它合併在這將是線性的?最後的merge是否正確,或者應該/可能是rebase也是?

回答

7

上午我就在說...

是:合併的改變創建一個帶有兩個(或更多,但通常是兩個)的父母一個新的提交。它不會重寫任何一方來包含另一方。


如果是這樣,我怎麼能可靠地講,當一些代碼被刪除了?

未引入功能與刪除功能不一樣。以下合併下圖:

base -> abc1111 [foo] -> {merge} abc2222 [with foo and mb-search] 
    \      /
     \-> abc0000 [mb-search]/

不顯示abc1111刪除MB-搜索。但是,在該提交中尋找mb-search_也不會顯示它。基本上,你正在檢查錯誤的東西。


相反,嘗試git blame --reverse base..abc2222

--reverse

城歷史前進而不是倒退。它不顯示一行顯示的修訂版本,而是顯示 中的最後一個修訂版本,該行已存在。這需要一系列的修訂,如 START..END,其中指責的路徑存在於START中。

如果你只是想看看誰刪除了這一行。


哦,你的特性分支衍合工作流程也許應該是:

git checkout -b responsive_somefeature responsive 
# write code, make commits 

# update local branch 
git checkout responsive 
git pull 

# rebase feature onto updated branch 
git rebase responsive responsive_somefeature 
## NB. this^will leave your feature branch checked out 

# finally merge (this should be fast-forward since we just rebased) 
git checkout responsive 
git merge responsive_somefeature 

它是明智定期做更新&底墊,所以你不反對的responsive

陳舊觀點工作
+0

太棒了,謝謝。順便說一下,當你說'base'時,你的意思是第一次出現? – LeonardChallis 2014-11-06 15:08:17

+0

示例中的'base'只是您想要更改的共同祖先,以及功能分支。 – Useless 2014-11-06 15:53:34

+0

謝謝@無用。你還介紹一下你提出的改版工作流程和我寫的內容之間的區別嗎? – LeonardChallis 2014-11-07 07:18:41

相關問題