3 回答

TA貢獻2016條經驗 獲得超9個贊
用git rebase。它是Git中的通用“take commit(s)and plop it / them on a different parent(base)”命令。
但是要注意一些事情:
由于提交SHA涉及其父項,因此當您更改給定提交的父項時,其SHA將更改 - 在開發行中將更改其后的所有提交(比它更新)的SHA也將更改。
如果您正在與其他人合作,并且您已經將提交的問題公開推送到他們撤回的地方,那么修改提交可能是一個壞主意?。這是由于#1,因此在嘗試弄清楚由于您的SHA不再與“相同”提交相匹配時發生的事情時,其他用戶的存儲庫將會遇到混淆。(有關詳細信息,請參閱鏈接手冊頁中的“從上游重新恢復”部分。)
也就是說,如果你目前在一個分支上有一些你希望轉移到新父級的提交,它看起來像這樣:
git rebase --onto <new-parent> <old-parent>
這會將當前分支之后 <old-parent>的所有內容移動到頂部<new-parent>。

TA貢獻1794條經驗 獲得超7個贊
如果事實證明你需要避免重新定義后續提交(例如,因為歷史重寫是站不住腳的),那么你可以使用git替換(在Git 1.6.5及更高版本中可用)。
# …---o---A---o---o---…
#
# …---o---B---b---b---…
#
# We want to transplant B to be "on top of" A.
# The tree of descendants from B (and A) can be arbitrarily complex.
replace_first_parent() {
old_parent=$(git rev-parse --verify "${1}^1") || return 1
new_parent=$(git rev-parse --verify "${2}^0") || return 2
new_commit=$(
git cat-file commit "$1" |
sed -e '1,/^$/s/^parent '"$old_parent"'$/parent '"$new_parent"'/' |
git hash-object -t commit -w --stdin
) || return 3
git replace "$1" "$new_commit"
}
replace_first_parent B A
# …---o---A---o---o---…
# \
# C---b---b---…
#
# C is the replacement for B.
在建立了上述替換后,對對象B的任何請求都將實際返回對象C.除了第一個父項(相同的父項(第一個除外),同一個樹之外,C的內容與B的內容完全相同)相同的提交消息)。
默認情況下,替換處于活動狀態,但可以通過使用git--no-replace-objects選項(在命令名之前)或通過設置環境變量來啟用替換。可以通過推送(除正常之外)共享替換。GIT_NO_REPLACE_OBJECTSrefs/replace/*refs/heads/*
如果您不喜歡commit-munging(使用上面的sed完成),那么您可以使用更高級別的命令創建替換提交:
git checkout B~0
git reset --soft A
git commit -C B
git replace B HEAD
git checkout -
最大的區別在于,如果B是合并提交,則此序列不會傳播其他父項。

TA貢獻1874條經驗 獲得超12個贊
請注意,更改Git中的提交要求必須更改其后的所有提交。如果您已經發布了這部分歷史記錄,那么就不鼓勵這樣做了,有人可能會在變更前的歷史上建立自己的工作。
替代解決方案git rebase中提到琥珀的反應是使用移植機制(見Git中移植的定義Git的詞匯和文檔.git/info/grafts文件在Git倉庫布局文檔)改變提交父,檢查它做正確的事情與一些瀏覽器的歷史(gitk,git log --graph等等,然后使用git filter-branch(如其聯機幫助頁的“示例”部分所述)使其永久化(然后刪除移植物,并選擇刪除備份git filter-branch或重新定義存儲庫的原始引用):
echo“$ commit-id $ graft-id”>> .git / info / grafts
git filter-branch $ graft-id..HEAD
注意 !??!該解決方案是從底墊的解決方案不同的是git rebase將重訂/移植的變化,而移植物為基礎的解決方案只會重新設置父級提交原樣,完全沒有考慮到老上級和新的父之間的差異!
- 3 回答
- 0 關注
- 1016 瀏覽
添加回答
舉報