revert用法 - 使用Git將特定文件重置或還原到特定版本?




git回到特定版本 (20)

git-aliases,awk和shell-functions來救援!

git prevision <N> <filename>

其中<N>是要回滾文件<filename>的文件的修訂版本數。
例如,要檢出單個文件x/y/zc前一個修訂版,請運行

git prevision -1 x/y/z.c

git prevision如何運作?

將以下內容添加到您的gitconfig

[alias]
        prevision = "!f() { git checkout `git log --oneline $2 |  awk -v commit="$1" 'FNR == -commit+1 {print $1}'` $2;} ;f"

命令基本上

  • 在指定的文件上執行git log
  • 在文件的歷史記錄中選擇適當的commit-id
  • 對指定文件的commit-id執行git checkout

基本上,在這種情況下,所有人都會手動完成,
包裹在一個美麗,高效的git-alias - git-prevision

我已經對作為一組文件的一部分提交了幾次的文件進行了一些更改,但現在想要將其上的更改重置/還原回以前的版本。

我已經做了一個git log和一個git diff來找到我需要的修訂版,但是根本不知道如何將文件恢復到以前的狀態。


git checkout ref | commitHash - filePath

例如

git checkout HEAD~5 -- foo.bar
or 
git checkout 048ee28 -- foo.bar

以下是rebase工作原理:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>

假設你有

---o----o----o----o  master
    \---A----B       <my branch>

前兩個命令...提交git checkout git rebase master

...查看要應用於master分支的更改分支。 rebase命令接受來自<my branch>的提交(在master找不到)並將它們重新應用到master的頭部。 換句話說, <my branch>第一次提交的父級不再是master歷史記錄中的先前提交,而是當前的主要提交者。 這兩個命令與:

git rebase master <my branch>

記住此命令可能更容易,因為“基本”和“修改”分支都是顯式的。

。 最終的歷史結果是:

---o----o----o----o   master
                   \----A'----B'  <my branch>

最後兩個命令......

git checkout master
git merge <my branch>

...執行快進合併以將所有<my branch>更改應用到master 。 如果沒有此步驟,則不會將rebase提交添加到master 。 最終結果是:

---o----o----o----o----A'----B'  master, <my branch>

master<my branch>都引用B' 。 此外,從這一點開始,刪除<my branch>引用是安全的。

git branch -d <my branch>

但是請注意, git checkout ./foogit checkout HEAD ./foo完全相同 ; 一個很好的例子:

$ echo A > foo
$ git add foo
$ git commit -m 'A' foo
Created commit a1f085f: A
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 foo
$ echo B >> foo
$ git add foo
$ echo C >> foo
$ cat foo
A
B
C
$ git checkout ./foo
$ cat foo
A
B
$ git checkout HEAD ./foo
$ cat foo
A

(第二個add階段在索引中的文件,但它沒有提交。)

Git checkout ./foo意味著從索引中恢復路徑./foo ; 在執行此操作之前,添加HEAD指示Git將索引中的路徑還原為其HEAD修訂版。


假設您想要的提交哈希是c5f567

git checkout c5f567 -- file1/to/restore file2/to/restore

git checkout手冊頁提供了更多信息。

如果你想在c5f567之前恢復到提交,請追加~1 (適用於任何數字):

git checkout c5f567~1 -- file1/to/restore file2/to/restore

作為旁注,我一直對這個命令感到不舒服,因為它用於普通事物(在分支之間切換)和不尋常的破壞性事物(丟棄工作目錄中的變化)。


如果您在上次提交中提交了錯誤的文件,請按照以下說明操作:

  1. 開源樹,更改為此提交

  1. 更改行並找到錯誤文件作為提交發送的提交

  1. 您可以在該提交中看到更改列表
  2. 選擇它,然後單擊右側的...按鈕...單擊反向文件
  3. 然後你可以在左下角的文件狀態選項卡上看到它然後點擊unstage:

  1. 打開您的visual studio代碼並通過提交已刪除的文件來恢復
  2. 在它們之後,您可以在源樹中的最後一次提交中看到結果


如果您知道需要返回的提交數量,可以使用:

git checkout master~5 image.png

這假設您在master分支上,並且您想要的版本是5提交回來。


如果您要將文件還原為先前的提交(以及要還原已提交的文件),則可以使用

git checkout HEAD^1 path/to/file

要么

git checkout HEAD~1 path/to/file

然後只需暫存並提交“新”版本。

知道在合併的情況下提交可以有兩個父項,你應該知道HEAD ^ 1是第一個父項,HEAD~1是第二個父項。

如果樹中只有一個父項,則兩者都可以工作。


您可以使用diff命令快速查看對文件所做的更改:

git diff <commit hash> <filename>

然後,要將特定文件還原到該提交,請使用reset命令:

git reset <commit hash> <filename>

如果您進行了本地修改,則可能需要使用--hard選項。

管理航點的良好工作流程是使用標籤在時間軸中清晰地標記點。 我不太明白你的最後一句話,但你可能想要的是從前一個時間點分支出一個分支。 為此,請使用方便的checkout命令:

git checkout <commit hash>
git checkout -b <new branch name>

然後,當您準備合併這些更改時,可以針對主線對其進行重新綁定:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>

您可以使用任何對git提交的引用,包括SHA-1,如果這是最方便的。 關鍵是命令看起來像這樣:

git checkout [commit-ref] -- [filename]


我必須在這裡插入EasyGit ,這是一個包裝器,使新手更容易接近git而不會混淆經驗豐富的用戶。 它所做的一件事就是git revert更多的含義 。 在這種情況下,您只需說:

eg revert foo/bar foo/baz


我想我已經找到了....來自http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html

有時候你只想回去忘記過去某一點的每一個變化,因為他們都錯了。

從...開始:

$ git log

它顯示了最近提交的列表及其SHA1哈希值。

接下來,鍵入:

$ git reset --hard SHA1_HASH

將狀態恢復到給定提交並永久刪除記錄中的所有較新提交。


當你說“回滾”時你必須要小心。 如果你曾經在提交$ A中有一個版本的文件,然後在兩個單獨的提交中進行了兩次更改$ B和$ C(所以你看到的是文件的第三次迭代),如果你說“我想回到第一個“,你真的是這個意思嗎?

如果你想要擺脫第二次和第三次迭代的變化,那很簡單:

$ git checkout $A file

然後你提交結果。 該命令詢問“我想從提交$ A記錄的狀態檢出文件”。

另一方面,你的意思是擺脫引入的第二次迭代(即提交$ B)的變化,同時保持$ C對文件的提交,你想要還原$ B

$ git revert $B

請注意,創建提交$ B的人可能不是非常自律,並且可能在同一次提交中提交了完全無關的更改,並且此恢復可能會觸及除了您看到違規更改的文件以外的文件 ,因此您可能需要在執行後仔細檢查結果所以。


要恢復到最常需要的最後提交的版本,您可以使用這個更簡單的命令。

git checkout HEAD file/to/restore

這對我有用:

git checkout <commit hash> file

然後提交更改:

git commit -a

這是我的方式。

a)在Android Studio中,打開文件。

b)git - >顯示歷史記錄,找到我想要恢復的先前提交。 獲取commit_id(即提交哈希)。

c) git checkout commit_id file_path


這裡的許多答案聲稱使用git reset ... <file>git checkout ... <file>但是通過這樣做,你將在你想要恢復的提交之後放棄對<file>提交的每個修改。

如果你只想恢復一個文件中的一個提交的更改,就像git revert那樣但僅針對一個文件(或者說是提交文件的一個子集),我建議同時使用git diffgit apply (使用<sha> =要恢復的提交的哈希值:

git diff <sha>^ <sha> path/to/file.ext | git apply -R

基本上,它將首先生成與您要還原的更改相對應的修補程序,然後反向應用修補程序以刪除這些更改。

當然,如果通過<sha1>HEAD (衝突)之間的任何提交修改了恢復的行,它將不起作用。


顯然有人需要在git上寫一本可理解的書,或者需要在文檔中更好地解釋git。 面對同樣的問題,我猜對了

cd <working copy>
git revert master

會撤消似乎做的最後一次提交。

伊恩


git checkout -- foo

這會將foo重置為HEAD。 你也可以:

git checkout HEAD^ foo

一次修訂,等等


git revert <hash>

將還原給定的提交。 聽起來你認為git revert只影響最近的提交。

如果您想恢復特定文件中的更改並且提交的更改超過該文件,那麼這並不能解決您的問題。





version-control