亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將git父指針設置為其他父級

將git父指針設置為其他父級

Git
拉莫斯之舞 2019-09-18 15:16:41
如果我在過去提交指向一個父級的提交,但我想更改它指向的父級,我將如何進行此操作?
查看完整描述

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>。


查看完整回答
反對 回復 2019-09-18
?
慕田峪9158850

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是合并提交,則此序列不會傳播其他父項。


查看完整回答
反對 回復 2019-09-18
?
HUWWW

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將重訂/移植的變化,而移植物為基礎的解決方案只會重新設置父級提交原樣,完全沒有考慮到老上級和新的父之間的差異!


查看完整回答
反對 回復 2019-09-18
  • 3 回答
  • 0 關注
  • 1016 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號