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

问题描述 投票:0回答:6

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

谢谢,昂德拉。

git reset pull git-pull
6个回答
75
投票

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

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

仅使用

git push
git pull
与存储库同步。可以将其视为使用 rsync 或任何备份解决方案来使两个位置具有完全相同的内容。就像你连接外置备份硬盘一样,然后将其中的内容与你的主硬盘中的内容保持一致。这就是
git pull
git push
的用法。

如果您只想在历史记录中来回查看,请使用

git checkout
进行操作。使用
git log
查看修订 ID。如果您使用的是 Linux,请使用
gitk
查看修订树。在Windows中,tortoise git可以使用修订图来显示它。

要返回最新版本,请使用

git checkout master
。在执行任何命令之前,请务必让自己执行
git status
。此命令将显示您需要了解的有关当前回购条件的所有信息,以及您需要采取哪些操作才能使其正确。在执行
git pull
git push
之前,最好确保
git status
结果显示
working directory clean

如果您需要将文件恢复到之前的版本,可以使用

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

我希望这对您有帮助。主要的关键是查看您的工作目录是您的存储库。理解这一点将帮助您充分利用 git 的功能。祝你好运。


44
投票

您可以使用

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

git checkout
使用提交 ID 而不是分支名称,可以将您从任何命名分支转移到所谓的 分离头

如果您使用

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


33
投票

其他答案内容丰富,但我相信这最接近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
即可恢复正常。


15
投票

尝试

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

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

希望这有帮助!


7
投票

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

git checkout rev -- filename

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

使用

git log
gitk
查看检查版本以查看您想要的文件版本。

要使该版本的文件永久存在,您需要提交该文件:

git add filename; git commit filename

我不建议

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

在这种情况下,您不需要使用

git reset
,除非您
git add
决定不提交文件。


0
投票

根据您在 git 历史记录中来回移动的原因,您可能会考虑仅查看历史记录。

我发现这篇文章试图弄清楚如何最好地查看提交历史记录和更改,以便我可以熟悉项目。我最终使用了

git log -p --oneline

-p
标志显示每次提交之间的差异。查看更多这里

© www.soinside.com 2019 - 2024. All rights reserved.