給定多個unpushed git
提交,是否有可能git-svn dcommit
其中一個提交?git-svn dmitmiting git commit
例如我犯了foo,bar和baz,但是現在我只想在svn回購中出現問題。這可能嗎?
給定多個unpushed git
提交,是否有可能git-svn dcommit
其中一個提交?git-svn dmitmiting git commit
例如我犯了foo,bar和baz,但是現在我只想在svn回購中出現問題。這可能嗎?
我有一種硬皮的答案。您可以創建一個新的分支,其中包含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
如果主人確實有這些提交可以作爲炙熱表明復位頭。
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的優選的是不使直接提交於主分支,它也可用於跟蹤遠程svn的。在地方分支上做你的工作,並在提交之前有選擇性地合併。
I聽到了關於合併發生的不同意見。我現在這樣做的方式是分支和dcommit,然後重新分配主。我把主人作爲規範的跟蹤分支,並在其他分支做我的工作。然後,我將這些變化推到svn並將它們拉入主。這就是我建議我在freenode的#git上做的事情。我按照你以前的建議來做,但是這是一個額外的步驟,因爲你需要將這些更改合併到master中,而不是將它們推送到svn並用rebase將它們拉下來。 – baudtack 2009-08-12 17:18:27
(以下假定你的工作是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狀態下的提交與它有關。
我覺得這個答案比別人更容易理解。 'git svn dcommit -n'或'--dry-run'的完美用例。 – hdl 2016-04-27 08:36:48
我只想提交我的分支的一些提交。例如。
A-----B-----C------D
^ ^
| |
svn/trunk trunk
如果我要提交B
和C
但不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-svn
將git-svn-id
添加到提交消息中,因此即使提交的內容相同,提交哈希也會更改。但由於內容相同,rebase不會引起衝突。
PS:我也經常忽略新分支和只是結賬分離。例如。
git checkout --detach C
git svn dcommit
git checkout trunk
git svn rebase
附加'git svn rebase'對我來說效果很好。 – Stefan 2017-10-06 06:52:01
@Stefan是的,這是真的。我原諒它,並會更新我的答案。 rebase是必要的,因爲提交將被git-svn重寫。它將'git-svn-id'添加到提交消息中。 – 2017-10-06 07:58:56
提交foo,bar和baz已經在主分支跟蹤svn回購? – Pradeep 2009-08-12 11:27:53
在我的情況下,沒有。但是展示如何做到這一點很好。 – baudtack 2009-08-12 17:37:50