2010-01-22 60 views
63

我有一個關於Git的新手問題:Git:如何在提交之間來回移動

我需要在分支的歷史中來回移動。 這意味着,我需要將所有文件都置於舊版本中的狀態,然後我需要返回存儲庫中的最新狀態。我不需要提交。

使用SVN,這將是

svn up -r800 

去修訂800和

svn up 

與存儲庫同步來獲得。

我知道的承諾我要回去給哈希,所以我嘗試

git reset <hash> 

這似乎讓我在那裏。但後來我試了

git pull 

但是抱怨衝突。

那麼通過分支歷史的正確途徑是什麼?

我想在SVN方面,所以不要猶豫,指向我一些不錯的教程。請注意,我已經檢查過http://git.or.cz/course/svn.htmlhttp://www.youtube.com/watch?v=8dhZ9BXQgc4

謝謝,翁德拉。

+1

附註:我習慣了完全避免'git pull'。相反,我在bash中使用'git fetch --all'別名到'gu',並且一直打開'gitk',查看所有分支 - 請參閱視圖 - >編輯 - >檢查全部4個複選框。然後我使用'git reset'或'gist stash' +'git co'來移動,這取決於我需要什麼。 – 2012-03-16 21:09:57

回答

59

那麼,我也是一位前svn用戶,現在在我的所有項目中都使用git。

使用git時,應該改變svn中使用的客戶端 - 服務器體系結構的思維方式。在svn中,每個更改都需要與服務器建立連接。使用git,您的repo位於工作目錄中。您不需要每個回購操作的連接。

只能用git pushgit pull與回購同步。想想像使用rsync或任何備份解決方案,使兩個地方有完全相同的內容。就像連接外部備份硬盤一樣,然後使其中的內容與主內容相同。這就是git pullgit push的用法。

如果你只是想回顧歷史,請使用git checkout。使用git history查看版本ID。如果您使用的是Linux,請使用gitk來查看修訂樹。在Windows中,tortoise git可以使用修訂圖顯示它。

要回到最新版本,請使用git checkout master。在做任何命令之前,請始終讓自己做git status。此命令將顯示您需要了解的當前回購條件的任何信息,以及您需要採取哪些措施才能使其正確。在做git pullgit push之前,最好確保git status結果包含文本working directory clean

如果您需要將文件恢復到之前的修訂版本,可以使用git merge來完成。在執行文件之前,先用git diff對其進行測試。例如:git diff rev1:rev2 filename。它會打印出兩個版本之間的任何不同。 rev1中的更改​​將被rev2中的更改所取代。所以要恢復,rev2將會比rev1更早。在滿足差異結果後,使用git merge進行處理,只需將diff替換爲merge,其他所有參數保持不變。

我希望這可以幫助你。主要的關鍵是看你的工作目錄是你的回購。理解這將幫助你使用git來完成它的功能。祝你好運。

37

您可以使用git checkout簽出任何提交,然後將其與分支名稱一起使用以返回到指定的分支。

git checkout帶有提交ID而不是分支名稱將您移出任何指定的分支,並返回到所謂的分離頭

如果你使用git reset那麼它會將你的分支本身移回到一箇舊的狀態,孤立更新的提交可能不是你想要的。

+0

「checkout」的功能是什麼?它是否通過在當前狀態和給定提交的狀態之間反向應用提交補丁來將文件更改爲給定提交的狀態? – 2010-01-22 23:43:37

+0

我找到了'git reset'和'git reset origin'。我不會做任何提交,因此,只要它很容易恢復(也就是說,通過一個命令),我是否鬆開最近的提交併不重要。 – 2010-01-22 23:45:49

+1

git checkout不要讓更改永久。要做到這一點,請使用git merge。看到我的答案。 – 2010-01-22 23:46:39

6

檢出一個不同版本的文件,使用

git checkout rev -- filename 

修訂版可以的ID提交,分支的名稱,標籤,或相對版本的名稱。

使用git loggitk看審查的版本就看你想要的文件的版本。

爲了使這個版本的文件永久性的,你需要提交的文件:git add filename; git commit filename

我不會建議git pull檢查版本,因爲它做了合併 - 可能修改你的當前狀態。

在這種情況下,您不需要使用git reset,除非您決定不提交一個文件git add

+0

甜jeebus這樣做時要小心。我的同事做了這個命令,嘗試從我的分支進行更改,抹掉了我的工作幾周的時間,並通過這樣做將其推回到回購中... – karina 2016-05-02 22:37:44

+0

只要你的同事沒有按下-f,你總是可以恢復他的承諾並恢復失蹤的工作。如果您有權訪問他推送的回購,甚至可以通過git reflog恢復強制推送。另外,如果你仍然有你的分支,它是可以恢復的。但是,是的,你必須小心。 – 2016-06-29 00:18:25

19

其他的答案是知識性的,但我相信這是最接近OP想要的東西:

這兩個功能添加到您的〜/ .bashrc:

# checkout prev (older) revision 
git_prev() { 
    git checkout HEAD~ 
} 

# checkout next (newer) commit 
git_next() { 
    BRANCH=`git show-ref | grep $(git show-ref -s -- HEAD) | sed 's|.*/\(.*\)|\1|' | grep -v HEAD | sort | uniq` 
    HASH=`git rev-parse $BRANCH` 
    PREV=`git rev-list --topo-order HEAD..$HASH | tail -1` 
    git checkout $PREV 
} 

用法:

$ git_prev 
Previous HEAD position was 7042c8a... Commit message2 
HEAD is now at d753ecc... Commit message1 

$ git_next 
Previous HEAD position was d753ecc... Commit message1 
HEAD is now at 7042c8a... Commit message2 

:這些命令總是進入detached HEAD狀態。如果git_prev然後git_next從當前簽出分支,您將最終回到最新版本,但您將處於分離HEAD狀態。請git checkout BRANCH_NAME恢復正常。

+0

一旦你做了這些事情,看一看git別名可能是值得的。 – rethab 2015-10-13 16:07:26

3

嘗試git reflog,它列出了您在提交之間切換的提交和檢出,即使您在簽出前一次提交時丟失的提交。

然後您可以嘗試git checkout <hash of a commit>切換到該提交。

希望這會有所幫助!

相關問題