2017-03-10 24 views
1

我對存儲庫的本地克隆進行了一些更改,並將它們提交到本地分支。我們稱這些更改爲「提交A」。我想繼續工作在提交A之上,但是當我準備好合併回主分支時,我不想提交合並。如何維護Git中本地和遠程存儲庫之間的某些文件差異?

我在想我可以使用git rebase -i並刪除提交A,但有沒有辦法讓該提交保持活動狀態,以便將來的工作可以在其上完成?然後,再次,工作合併回主分支沒有承諾答:

我意識到我在做什麼有點粗略,但在提交A中更改的行是正交於其上的工作。這些更改與機器(生產和測試)之間的差異有關,因爲它們必須引用不同版本的第三方庫。

回答

1

我在想我可以使用git rebase -i並刪除提交A,但有沒有辦法讓該提交保持活動狀態,以便將來的工作可以完成?然後,再次,工作合併回主分支而沒有承諾A.

您可以標記它。從分支中刪除的提交不會消失。然後當你需要時,你可以選擇標籤。那就是:

git tag somename SHA1 
... 
git rebase -i OLDREV 
... 
git cherry-pick somename 
1

嗯,也許這:

創建兩個分支,一個與試驗的變化改變了PROD之一。然後你的工作流程將如下所示:

1) Pull updates 
2) Create a local working/topic branch 
3) Merge from Test branch 
4) Do your work, test, etc. 
5) When ready to push back, first merge from Prod branch 
6) Merge back into your main/develop/master branch 
7) Push 

這樣做會工作嗎?

1

我在這種情況下所做的是隱藏提交A中的更改(不提交它們)。這樣,任何時候我想要處理這些變化時,我都會使用這個存儲(見下文),但只要我不提交它們,我不必擔心它們會以遠程方式結束。如果A中更改的文件與您正在處理的文件不同,這是最簡單的。

現在要設置它,假設A是分支上的最後一個提交。

git reset --soft HEAD~1 
git stash 

及更高版本:

git stash list 
git stash apply [email protected]{n} 

git stash list是找到n

+1

這會起作用,但有兩個原因我不喜歡它個人。 (1)您必須小心,不要意外提交隱藏的更改,這可能會在工作流程的隨機點創建額外的工作。 (2)我只是不喜歡長壽的積木;我想我不會在意如果我不使用短暫存放的相當一部分,但是因爲我發現長期存放我的方式。但是ymmv –

1

之前,我給我的回答是:我會建議逼近問題的根源(需要在不同的機器上的不同代碼)一種更正式的方式,因爲我懷疑這最終會給你帶來更多麻煩。根據語言和工具的不同,我認識到這可能並不容易(當然,如果不瞭解語言,工具等,我無法提供一個通用的解決方案),但您可能會覺得它值得。

但是,嘿,假設你目前的做法是要爲你工作得很好,這裏是你會怎麼做堅持下去:

你開始這種情況

X --- X <--(origin/master) 
     \ 
     A --- B --- C <--(master) 

你要推的變化形成BC,但不是A;此外,您希望本地繼續工作,基於ABC的所有更改。

爲了讓事情辦得那樣順利,因爲他們可以,你也想混帳認識到,從BC變化的照顧,這樣以後(當你有D並希望將它),你不」最終導致一堆毫無意義的衝突解決。

所以首先做你的互動rebase;但不是刪除A,而是將其移至TODO列表的末尾。此操作後,您應該

X --- X <--(origin/master) 
     \ 
     B' --- C' --- A' <--(master) 

(技術上A,B和C都還在閒逛,你可以回到他們,如果你需要,但如果一切順利的話,你會不會需要)

現在你想要退回master上一個提交,按下,然後將master拉回到A'

git reset --hard HEAD^ 
git push 
git reset --hard [email protected]{1} 

產生

X --- X --- B' --- C' <--(origin/master) 
        \ 
         A' <--(master) 

進行,必要時重複

1

使用git rebase --onto變基的一切行動(但不包括)答rebase documentation具有匹配,使用--onto很好的例子你正在描述的場景。從本質上講,你會做:

git rebase --onto master A 

如果您不希望當前分支被重建基礎(因爲你想保持它的工作之後),然後就檢查出一個新的臨時黨支部第一:

git checkout -b new-temporary-branch 
git rebase --onto master A 

然後通過將主合併到主分支來快速轉發新分支。

相關問題