2012-12-01 37 views
1

我是git的新手。git回滾用例

我在A way中實現了一個功能。
我想嘗試在B way中實現相同的功能。

那麼我可能需要一些時間來評估B way是否是一個好主意。
在評估它時,我會修改程序的other parts

假設,我決定B was bad and A was better,並且想回到A way
但我想保留對該程序的other parts的修改。

這可以在git中完成嗎?

CNC中
我添加圖片,以便更好地解釋我試圖完成

目前,我在a_way(完成實現)的結束,除了我不知道其中X是...

   [a_way] 
o---X---a---a---a 

我想嘗試b_way。
開始從我所在的地方,刪除(或註釋掉)以a_way相關的代碼,並實現b_way

o---X---a---a---a 
        \ 
        remove a_way--implement b_way 

我需要一些時間來評估b_way的成效,並會不斷開發其他功能。

o---X---a---a---a 
        \ 
        remove a_way--implement b_way--develop new features 

現在我認爲a_way比b_way更好,並決定返回a_way。

o---X---a---a---a--------------------------------new features(I wanna end up here) 
        \ 
        remove a_way--implement b_way--new features 
+0

細節取決於你是否在單獨的分支中做過''A''和''B'' –

+0

我已經在A的末尾了。 – eugene

回答

0

聽起來很像你在重新綁定後。

在git中做到這一點的一種方法是有兩個分支a_wayb_way

當你finshed建設兩種方式,你將有一個樹,看起來像這樣

   [a_way] 
o---X---a---a---a 
     \ 
     -b---b---b 
       [b_way] 

哪裏a是執行的方式提交,b是實現B.

的commmits

現在假設一旦a_way完成並暫時離開,您將分支名稱更改爲develop。你樹將是這樣的:

   [a_way] 
o---X---a---a---a---d1---d2---d3---d4 [develop] 
     \ 
     -b---b---b 
       [b_way] 

現在,您決定要擺脫a_way,並切換到b_way代替。

git rebase --onto b_way a_way develop 

會給我:

   [a_way] 
o---X---a---a---a 
     \ 
     -b---b---b---d1'---d2'---d3'---d4' [develop] 
       [b_way] 

注意:如果發展中有合併,這將拉平的合併,我懷疑那裏有一個方法來保存合併,但我還沒有需要它然而。它也會導致提交ID發生變化,如果有其他人正在做這些工作,這可能會導致問題。

附錄

這聽起來像你的資料庫是這樣的:

       [a_way] 
o---X    a---a---a 
     \   /
     -b---b---b---d1---d2---d3---d4 [develop] 
       [b_way] 

如果你希望它最終是這樣的:

       [a_way] 
o---X    a---a---a 
     \   /  \ 
     b---b---b   d1'---d2'---d3'---d4' [develop] 
       [b_way] 

然後命令你會問題是

git rebase --onto a_way b_way develop 

或在這種情況下,它可以簡化爲

git checkout develop 
git rebase a_way 

附錄

所以,你的程序存儲庫實際上是這樣的:

o---X---a---a---a [a_way] 
        \ 
        da---da---da---b---b---b---f---f---f [develop] 
          [remove_a] [b_way] 

你想要去

o---X---a---a---a---f---f---f [develop] 
        \ 
        da---da---da---b---b---b 

做到這一點的命令是

git rebase --onto a_way b_way develop 

如果你沒有在規定的地方分支機構可以使用commit SHA值。

git rebase --onto a_way 
+0

不錯的圖片描述(儘管A&B從我的問題轉換過來)概念。讓我清楚一件事。我在主分支上(在你答案的b_way結尾處)。現在我正在爲a_way創建一個分支並進行開發。所以a_way將在b_way的末尾分支出去(而不是從共同的父母分支出去)。我認爲這會影響我可以採取的整體策略?第二個問題:第二張圖片中的[a_way]和[develop]似乎與特定的節點相關聯。我解釋正確嗎? [branch_name]可以與git歷史記錄中的特定節點相關聯? – eugene

+0

@Eugene在git中,一個分支只是對當前該分支上最新提交的提交的引用。因此,分支名稱總是可以解析爲一個提交(但不一定是同一個提交),但是不能確定在哪個分支上提交了一個提交。 – qqx

+0

我試圖在從d1到d1的變化中顯示的是,提交SHA將在rebase上發生變化,但每個提交的內容基本上應保持不變(除已應用的衝突和檢測外變化)。 –

0

你必須在單獨的分支AB,讓說AB。一旦你決定要保留A,你會將其合併回開發分支(通常爲masterdevelop)。

git checkout master 
git merge A 

你擺脫兩個分支AB

git branch -d `A` 
git branch -D `B` 

因爲B不合併到開發分支和變化會迷路,你必須強制刪除與大寫D

And other parts?他們可能已經在我們的開發分支中(如masterdevelop或其他),並且即使在合併A之後仍保留在那裏。

0

你曾經犯過嗎? 如果沒有,git stash可能會揭示你在上​​次提交後做了什麼,然後你可以嘗試另一種方式。當你想改變,只是使用git stash apply

這是與上述不同的另一種方式,但我認爲使用分支要好得多,因爲你是新來的git,這是非常重要的,你要知道這個:-)