2009-08-10 187 views
25

給定多個unpushed git提交,是否有可能git-svn dcommit其中一個提交?git-svn dmitmiting git commit

例如我犯了foo,bar和baz,但是現在我只想在svn回購中出現問題。這可能嗎?

+0

提交foo,bar和baz已經在主分支跟蹤svn回購? – Pradeep 2009-08-12 11:27:53

+0

在我的情況下,沒有。但是展示如何做到這一點很好。 – baudtack 2009-08-12 17:37:50

回答

4

我有一種硬皮的答案。您可以創建一個新的分支,其中包含out foo,bar和baz,然後cherry-pick bar到新分支,然後git-svn dcommit分支並在完成時將其刪除。這雖然看起來不太優雅。

所以,假設foo,bar和baz在分支x中,而master沒有任何分支。

git branch y master

git checkout y

git cherry-pick <sha1 of bar>

git svn dcommit

git checkout x

git svn rebase

git branch -d y

如果主人確實有這些提交可以作爲炙熱表明復位頭。

+0

我會提交主分支並保持其他位分開。您也可以在這裏使用藏匿處。 – 2009-08-10 19:25:31

+0

@Ben我不知道如何提交主分支會有所幫助。我已經有了foo和bar以及baz作爲git中的提交。他們還沒有完成對svn回購。如果我創建一個新的分支並挑選我想要的分支,那麼我只能獲得這些提交。 – baudtack 2009-08-10 21:11:03

+0

如果你在master上工作,你仍然想這樣做,你可以使用:「git checkout trunk -by」 - 如果這不適合你,請查看git svn文檔並搜索佈局選項 – haggi 2012-10-19 08:59:52

13

git svn dcommit不能有選擇地提交欄。如果你直接在你的主分支上提交了foo,bar和baz,那麼你必須執行以下操作才能在svn中獲得僅限酒吧。

假設酒吧的承諾SHA是一樣的東西13abc ...

和git日誌主顯示所有3提交富,酒吧和巴茲。

  • 你需要創建一個主分支

    的Git分支WIP

在製品分公司現在有富,酒吧和巴茲

  • 重置主人的頭在任何foo,bar或baz之前提交。你可以做到這一點使用git reset(閱讀手冊,硬,軟及混合選項之間的差異會影響你的工作樹未提交的更改)

    的git的復位 - 硬(富前提交-ID,酒吧,巴茲)

    (或)

    的git的復位 - 硬HEAD〜3(回3版本)

現在你的主分支現在沒有富,酒吧或巴茲的。使用git log進行驗證。

  • 現在你可以櫻桃只挑選你想提交的提交到svn從wip分支進入master。所以要得到巴

    git的櫻桃挑選WIP 13abc(巴沙提交)

主只得到了酒吧單獨提交。

  • 現在git svn dcommit應該單獨推杆。

建議將來使用

所以對於GIT中 - svn的優選的是不使直接提交於主分支,它也可用於跟蹤遠程svn的。在地方分支上做你的工作,並在提交之前有選擇性地合併。

+0

I聽到了關於合併發生的不同意見。我現在這樣做的方式是分支和dcommit,然後重新分配主。我把主人作爲規範的跟蹤分支,並在其他分支做我的工作。然後,我將這些變化推到svn並將它們拉入主。這就是我建議我在freenode的#git上做的事情。我按照你以前的建議來做,但是這是一個額外的步驟,因爲你需要將這些更改合併到master中,而不是將它們推送到svn並用rebase將它們拉下來。 – baudtack 2009-08-12 17:18:27

26

(以下假定你的工作是master

首先,重新排序最後三個提交,這樣bar是第一次。

git rebase -i HEAD~3 

的編輯器會彈出這樣的:

pick 498e4f4 foo 
pick 71547ae bar 
pick abf09c6 baz 

# Rebase 4d3fe72..abf09c6 onto 4d3fe72 
# 
# ... 

重新排序,在彈出讓bar至上的編輯器。

pick 71547ae bar 
pick 498e4f4 foo 
pick abf09c6 baz 

# Rebase 4d3fe72..abf09c6 onto 4d3fe72 
# 
# ... 

Git會旋轉幾秒鐘,打嗝了確認:

Successfully rebased and updated refs/heads/master. 

現在你可以暫時回滾到bar提交(HEAD~2指兩次提交從HEAD背面)和dcommit它:

git checkout HEAD~2 
git svn dcommit 

如果你是偏執狂和我一樣,你可以做git svn dcommit -n首先要確保你只犯了什麼你要。

現在跳回master

git checkout master 

的最後一位是衍合,使master與SVN同步起來:

git svn rebase 

這是一個有點模糊到我,爲什麼這是必需的,但我猜測,在獨立HEAD狀態下的提交與它有關。

+0

我覺得這個答案比別人更容易理解。 'git svn dcommit -n'或'--dry-run'的完美用例。 – hdl 2016-04-27 08:36:48

1

我只想提交我的分支的一些提交。例如。

A-----B-----C------D 
^    ^
|     | 
svn/trunk   trunk 

如果我要提交BC但不D我創建一個新的分支,做一個svn dcommit,切換回trunk和刪除分支。

雖然我對分支trunk我做

git checkout -b temp `C` 
git svn info // just to check that branch temp is properly connected to svn 
git svn dcommit 
git checkout trunk 
git branch -D temp 

編輯

像斯特凡說:

有了一個額外的 '混帳SVN變基' 它的工作很適合我。

這是必須的,因爲提交到svn的提交將被重寫。 git-svngit-svn-id添加到提交消息中,因此即使提交的內容相同,提交哈希也會更改。但由於內容相同,rebase不會引起衝突。

PS:我也經常忽略新分支和只是結賬分離。例如。

git checkout --detach C 
git svn dcommit 
git checkout trunk 
git svn rebase 
+1

附加'git svn rebase'對我來說效果很好。 – Stefan 2017-10-06 06:52:01

+0

@Stefan是的,這是真的。我原諒它,並會更新我的答案。 rebase是必要的,因爲提交將被git-svn重寫。它將'git-svn-id'添加到提交消息中。 – 2017-10-06 07:58:56