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

yzxexxkh  于 2023-04-04  发布在  Git
关注(0)|答案(6)|浏览(130)

我有一个关于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
谢了昂德拉

eqfvzcg8

eqfvzcg81#

我以前也是svn用户,现在我所有的项目都使用git。
在使用git的时候,你应该改变一下svn中使用的客户端-服务器架构的思维方式。在svn中,每一个更改都需要连接到服务器。使用git,你的repo在工作目录中。你不需要每个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。它将打印出两个版本之间的任何差异。rev 1中的更改将被rev 2中的更改替换。因此要执行revert,rev 2将比rev 1旧。在您对diff结果满意之后,使用git merge执行此操作,只需将diff替换为merge,所有其他参数保持不变。
我希望这对你有帮助。主要的关键是要看到你的工作目录是你的仓库。理解这一点将有助于你充分利用git的能力。祝你好运。

1mrurvl1

1mrurvl12#

您可以使用git checkout来 checkout 任何提交,然后将其与分支名称一起使用以返回到已命名的分支。
git checkout使用提交ID而不是分支名称将您从任何命名的分支转移到所谓的 * 分离头 *。
如果你使用git reset,那么它会将你的分支本身移回一个旧的状态,孤立最近的提交,这可能不是你想要的。

gg0vcinb

gg0vcinb3#

其他的答案都是信息丰富的,但我相信这是最接近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状态。如果你从当前 checkout 的分支git_prev然后git_next,你将最终回到最新的版本,但你将处于分离的HEAD状态。执行git checkout BRANCH_NAME以恢复正常。
zphenhs4

zphenhs44#

试试git reflog,它列出了你在提交之间切换的提交和 checkout ,甚至是你在 checkout 到前一个提交时丢失的提交。
然后你可以尝试git checkout <hash of a commit>来切换到那个提交。
希望这有帮助!

hc8w905p

hc8w905p5#

若要 checkout 文件的其他版本,请使用

git checkout rev -- filename

其中 rev 可以是提交的ID、分支的名称、标记的名称或相对版本。
使用git loggitk查看检查版本以查看您想要的文件版本。
要使此版本的文件永久化,您需要提交该文件:git add filename; git commit filename
我不建议使用git pull来检查版本,因为它会进行合并--可能会修改您的当前状态。
在这种情况下,您不需要使用git reset,除非您git add您决定不提交的文件。

3vpjnl9f

3vpjnl9f6#

根据你在git历史中来回移动的原因,你可以考虑只查看历史。
我发现这篇文章试图找出如何最好地查看提交历史和更改,以便我可以熟悉一个项目。
-p标志显示每次提交之间的差异。查看更多here

相关问题