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

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

刪除特定的提交

刪除特定的提交

Git
犯罪嫌疑人X 2019-11-05 10:31:48
我和一個朋友一起在一個項目上工作,他編輯了一堆本不應該編輯的文件。我以某種方式將他的作品合并到我的作品中,無論是在我拉出它時,還是當我試圖只選擇想要的特定文件時。我一直在尋找和玩耍很長時間,試圖弄清楚如何刪除包含對這些文件所做的修改的提交,這似乎是在還原和變基之間的一次折騰,并且沒有簡單的示例,并且文檔假定我比我知道的更多。因此,這是問題的簡化版本:在以下情況下,如何刪除提交2?$ mkdir git_revert_test && cd git_revert_test$ git initInitialized empty Git repository in /Users/josh/deleteme/git_revert_test/.git/$ echo "line 1" > myfile$ git add -A$ git commit -m "commit 1"[master (root-commit) 8230fa3] commit 1 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 myfile$ echo "line 2" >> myfile$ git commit -am "commit 2"[master 342f9bb] commit 2 1 files changed, 1 insertions(+), 0 deletions(-)$ echo "line 3" >> myfile$ git commit -am "commit 3"[master 1bcb872] commit 3 1 files changed, 1 insertions(+), 0 deletions(-)預期的結果是$ cat myfileline 1line 3這是我一直嘗試還原的示例$ git revert 342f9bbAutomatic revert failed.  After resolving the conflicts,mark the corrected paths with 'git add <paths>' or 'git rm <paths>'and commit the result.
查看完整描述

3 回答

?
牛魔王的故事

TA貢獻1830條經驗 獲得超3個贊

Git在計算要還原的差異時使用的算法要求


還原的行不會被以后的任何提交修改。

歷史上以后沒有其他“相鄰”的提交。

“相鄰”的定義基于上下文差異的默認行數,即3。因此,如果“ myfile”的構造如下:


$ cat >myfile <<EOF

line 1

junk

junk

junk

junk

line 2

junk

junk

junk

junk

line 3

EOF

$ git add myfile

$ git commit -m "initial check-in"

 1 files changed, 11 insertions(+), 0 deletions(-)

 create mode 100644 myfile


$ perl -p -i -e 's/line 2/this is the second line/;' myfile

$ git commit -am "changed line 2 to second line"

[master d6cbb19] changed line 2

 1 files changed, 1 insertions(+), 1 deletions(-)


$ perl -p -i -e 's/line 3/this is the third line/;' myfile

$ git commit -am "changed line 3 to third line"

[master dd054fe] changed line 3

 1 files changed, 1 insertions(+), 1 deletions(-)


$ git revert d6cbb19

Finished one revert.

[master 2db5c47] Revert "changed line 2"

 1 files changed, 1 insertions(+), 1 deletions(-)

然后一切都按預期工作。


第二個答案非常有趣。有一個尚未正式發布的功能(盡管它在Git v1.7.2-rc2中可用)稱為恢復策略。您可以像這樣調用git:


git revert --strategy解決 <commit>


并且應該可以更好地弄清您的意思。我不知道可用策略的清單是什么,也不知道任何策略的定義。


查看完整回答
反對 回復 2019-11-05
?
回首憶惘然

TA貢獻1847條經驗 獲得超11個贊

有四種方法:


干凈的方法,還原但保留日志中的還原:


git revert --strategy resolve <commit>

嚴厲的方式,只刪除最后一次提交:


git reset --soft "HEAD^"

注意:避免使用,git reset --hard因為它還會丟棄自上次提交以來文件中的所有更改。如果--soft不起作用,請嘗試--mixed或--keep。


重新設置基準(顯示最近5次提交的日志,并刪除不需要的行,或者重新排序或將多個提交壓縮為一個,或者執行其他任何想要的操作,這是一個非常通用的工具):


git rebase -i HEAD~5

如果犯了一個錯誤:


git rebase --abort

快速變基:使用其ID僅刪除特定的提交:


git rebase --onto commit-id^ commit-id

替代方法:您也可以嘗試:


git cherry-pick commit-id

另一個選擇:


git revert --no-commit

作為最后的選擇,如果您需要完全的歷史記錄編輯自由(例如,由于git不允許您編輯想要的內容),則可以使用此非??焖俚拈_源應用程序:reposurgeon。


注意:當然,所有這些更改都是在本地完成的,git push此后您應該將更改應用到遙控器。并且如果您的倉庫不想刪除提交(“不允許快速轉發”,當您想刪除已經推送的提交時會發生這種情況),您可以git push -f用來強制推送更改。


注意2:如果在分支上工作并且需要強制執行推送,則應絕對避免,git push --force因為這可能會覆蓋其他分支(如果您在其中進行了更改,即使您當前的結帳在另一個分支上)。強制推送時,總是選擇指定遠程分支:git push --force origin your_branch。


查看完整回答
反對 回復 2019-11-05
?
江戶川亂折騰

TA貢獻1851條經驗 獲得超5個贊

您的選擇介于

  1. 保持錯誤并引入修復程序,并

  2. 刪除錯誤并更改歷史記錄。

您應該選擇(1)如果其他任何人都接受了錯誤的更改,則選擇(2)如果錯誤僅限于未按下的私有分支。

Git恢復是一種自動執行的工具(1),它會創建一個新的提交來撤消某些先前的提交。您將在項目歷史記錄中看到錯誤和刪除,但是從您的存儲庫中提取信息的人員在進行更新時不會遇到問題。在您的示例中,它不是自動運行的,因此您需要編輯“ myfile”(刪除第2行),執行git add myfilegit commit處理沖突。然后,您將在歷史記錄中獲得四次提交,而提交4將還原提交2。

如果沒有人關心您的歷史記錄更改,則可以重寫它并刪除提交2(選擇2)。最簡單的方法是使用git rebase -i 8230fa3。這將使您進入編輯器,并且可以通過刪除提交(并在其他提交消息旁邊保持“ pick”)來選擇不包括錯誤的提交。請仔細閱讀這樣做的后果。


查看完整回答
反對 回復 2019-11-05
  • 3 回答
  • 0 關注
  • 585 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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