Git:如何在提交之间来回移动

时间:2010-01-22 23:18:26

标签: git reset pull git-pull

我有一个关于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

谢谢,Ondra。

5 个答案:

答案 0 :(得分:64)

好吧,我也是以前的svn用户,现在我的所有项目都使用git。

使用git时,您应该改变svn中使用的客户端 - 服务器体系结构的思维方式。在svn中,每次更改都需要与服务器建立连接。使用git,您的repo位于工作目录中。每个repo操作都不需要连接。

仅使用git pushgit pull与repo同步。可以想象它使用rsync或任何备份解决方案,使两个地方具有完全相同的内容。就像连接外部备份硬盘一样,然后使其内容与主内容相同。这是git pullgit push的使用情况。

如果您只是想要回顾历史记录,请使用git checkout进行操作。使用git history查看修订版ID。如果您使用的是Linux,请使用gitk查看修订树。在Windows中,togise 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来实现它的全部功能。祝你好运。

答案 1 :(得分:37)

您可以使用git checkout签出任何提交,然后将其与分支名称一起使用以返回指定的分支。

带有提交ID而不是分支名称的

git checkout会使您离开任何已命名的分支,并移动到所谓的分离的头

如果您使用git reset,那么它会将您的分支本身移回旧状态,孤立可能不是您想要的最新提交。

答案 2 :(得分:26)

其他答案是提供信息的,但我相信这与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恢复正常。

答案 3 :(得分:6)

要结帐文件的其他版本,请使用

git checkout rev -- filename

其中 rev 可以是提交的ID,分支的名称,标记的名称或相对版本。

使用git loggitk查看版本以查看所需文件的版本。

要使此版本的文件成为永久版,您需要提交文件:git add filename; git commit filename

我不建议git pull检查版本,因为它会进行合并 - 可能会修改您当前的状态。

在这种情况下,您不需要使用git reset,除非git add您决定不提交文件。

答案 4 :(得分:6)

尝试git reflog,它列出了您在提交之间切换的提交和检查,甚至是在结账时丢失的提交到之前的提交。

然后,您可以尝试git checkout <hash of a commit>切换到该提交。

希望这有帮助!

相关问题