81

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

谢谢,昂德拉。

4

5 回答 5

73

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

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

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

如果您只想来回查看历史记录,请使用git checkout. 使用 . 查看修订 ID git history。如果您使用gitk的是 Linux,请使用 查看修订树。在 Windows 中,tortoise git 可以使用修订图显示它。

要返回最新版本,请使用git checkout master. 在做任何命令之前,总是让自己做git status。此命令将显示您需要了解的有关当前回购条件的任何信息,以及您需要执行哪些操作才能使其正确。在做git pulland之前git push,最好确保git statusresult 包含 text working directory clean

如果您需要将文件恢复到以前的版本,您可以使用git merge. 在对文件执行此操作之前,请先使用git diff. 例如:git diff rev1:rev2 filename。它将打印出两个修订版之间的任何差异。rev1 中的更改将替换为 rev2 中的更改。所以要进行还原,rev2 将比 rev1 旧。对差异结果满意后,使用 进行操作git merge,只需替换diffmerge,所有其他参数保持不变。

我希望这可以帮助你。主要的关键是看到你的工作目录是你的回购。了解这一点将帮助您充分利用 git。祝你好运。

于 2010-01-22T23:43:44.470 回答
42

您可以使用git checkout检查任何提交,然后将其与分支名称一起使用以返回到命名分支。

git checkout使用提交 ID 而不是分支名称会将您从任何命名分支移至所谓的分离头

如果你使用git resetthen 它将把你的分支本身移回旧状态,孤立最近的提交,这可能不是你想要的。

于 2010-01-22T23:19:55.217 回答
32

其他答案提供了丰富的信息,但我相信这最接近 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

注意:这些命令总是进入分离 HEAD状态。如果您git_prev随后git_next从当前签出的分支返回,最终将返回最新版本,但您将处于分离的 HEAD 状态。做git checkout BRANCH_NAME才能恢复正常。

于 2014-04-19T16:03:41.103 回答
15

Try git reflog,这会列出您为在提交之间切换所做的提交和签出,甚至是您在签出到先前提交时丢失的提交。

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

希望这可以帮助!

于 2014-07-29T23:42:07.213 回答
7

要签出文件的不同版本,请使用

git checkout rev -- filename

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

使用git log,gitk查看版本以查看您想要的文件版本。

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

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

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

于 2010-01-26T13:14:10.787 回答