ChatGPT解决这个技术问题 Extra ChatGPT

如何回到 Git 中的最新版本?

我最近从 SVN 搬到了 Git,对某些事情有点困惑。我需要通过调试器运行以前版本的脚本,所以我做了 git checkout <previous version hash> 并做了我需要做的事情。

现在我想回到最新版本,但我不知道它的哈希值。当我输入 git log 时,我看不到它。

我怎样才能做到这一点?此外,有没有比输入哈希更简单的方法来更改版本 - 例如“返回两个版本”或“转到按时间顺序排列的最新版本”?


A
Ana Betts

git checkout master 应该可以解决问题。要返回两个版本,您可以说类似 git checkout HEAD~2,但最好在那个时间创建一个临时分支基于,所以 git checkout -b temp_branch HEAD~2


凉爽的! git checkout master 正是我从分支切换回来的方式。那么这是否意味着当我签出以前的版本时,我实际上是在创建一个分支?
@Nathan:在 git 中,分支实际上主要是指向某个修订的可移动指针。所以从概念上讲,你是在创建一个分支,但不是 git 认为的分支。
所以在最简单的情况下,我有一堆线性变化,当我签出早期版本时,我将 HEAD 指针移到那里,这意味着 git log 将相对于该点显示?当我结帐 master 时,我将指针移动到 master 分支的最新版本?
@内森:没错。 HEAD 是一种称为符号引用的东西 - 它通常是指向另一个引用(当前签出的分支)的指针。 git checkout 是一种移动 HEAD 的方法。当你分离 HEAD 时,你让它直接指向给定的提交;当您再次签出 master 时,它又指向 master。 (许多像 git log 这样的命令实际上采用了一个修订范围,默认为 HEAD。)
是的 - HEAD 是用于指代“工作目录中的代码版本”的“代词”。它也是“你接下来承诺的任何事情的父母”的代名词
T
Thomio

当您签出特定提交时,git 会创建一个分离的分支。所以,如果你打电话:

$ git branch 

你会看到类似的东西:

* (detached from 3i4j25)
  master
  other_branch

要回到主分支头,您只需要再次签出到您的主分支:

$ git checkout master

此命令将自动删除分离的分支。

如果 git checkout 不起作用,您可能修改了在分支之间发生冲突的文件。为防止您丢失代码,git 要求您处理这些文件。你有三个选择:

存储你的修改(你可以稍后弹出它们): $ git stash 丢弃更改重置分离的分支: $ git reset --hard 使用以前的修改创建一个新分支并提交它们: $ git checkout -b my_new_branch $ git添加 my_file.ext $ git commit -m "My cool msg"

在此之后,您可以返回您的主分支(最新版本):

$ git checkout master

L
Liam

这对我有用(我仍然在主分支上):

git reset --hard origin/master

reset --hard 太过分了,表明您不知道您所做的修改。这可能导致它丢失代码。
就我而言,我想摆脱未推送的意外提交的更改。我知道可以有其他方法来实现这一点。我同意,如果您不想放弃未推送的已提交更改,这就是数据丢失。
这个答案有一个小细节。如果远程分支收到强制推送提交(例如,由于 rebaseamend),您的本地/远程分支将分歧,您需要将本地分支重置为远程分支,使用远程更新本地分支修改。在这种情况下,您并没有真正返回到最新版本。如需正确答案,请搜索 git remote branch diverged
I
Itai Noam

这里的一些答案假设您在决定签出较旧的提交之前处于 master 分支。这并非总是如此。

git checkout -

将指向您之前所在的分支(无论它是否是主分支)。


不需要分支,它将 HEAD 指向它之前指向的位置;如果您在 git checkout hash1 之后执行了 git checkout hash2,则 git checkout - 会将您带回 hash1
R
Reggie Pinkham

要返回最新版本:

git checkout <branch-name> 

例如,git checkout mastergit checkout dev


J
Jay

一方面,您可以使用分支名称签出。

我知道有几种方法可以移动 HEAD,但我会把它留给 git 专家来枚举它们。

我只是想建议gitk --all——我发现它在开始使用 git 时非常有用。


C
Community

我刚刚开始深入研究 git,所以不确定我是否理解正确,但我认为 OP 问题的正确答案是您可以使用如下格式规范运行 git log --allgit log --all --pretty=format:'%h: %s %d'。这会将当前签出的版本标记为 (HEAD),您可以从列表中获取下一个版本。

顺便说一句,将这样的别名添加到您的 .gitconfig 中,格式稍好一些,然后您可以运行 git hist --all

  hist = log --pretty=format:\"%h %ai | %s%d [%an]\" --graph

关于相对版本,我找到了这个post,但它只谈论旧版本,可能没有什么可以参考新版本。


k
kujiy

当你回到以前的版本时,

$ git checkout HEAD~2
Previous HEAD position was 363a8d7... Fixed a bug #32

即使在这种情况下,您也可以使用此命令查看您的功能日志(哈希);

$ git log master --oneline -5
4b5f9c2 Fixed a bug #34
9820632 Fixed a bug #33
...

master 可以替换为另一个分支名称。

然后检查它,您将能够返回该功能。

$ git checkout 4b5f9c2
HEAD is now at 4b5f9c2... Fixed a bug #34

V
VonC

对于 Git 2.23+(2019 年 8 月),最佳做法是使用 git switch 而不是 confusing git checkout 命令。

要基于旧版本创建新分支:

git switch -c temp_branch HEAD~2

要返回当前的 master 分支:

git switch master

I
Ilya Gazman

一个更优雅和简单的解决方案是使用

git stash

它将返回分支的最新本地版本,并将您的更改保存在 stash 中,因此如果您想撤消此操作,请执行以下操作:

git stash apply

我知道它已经很老了,但我必须对此发表评论(因为我认为不应该使用这个解决方案) - 我不会使用这个解决方案,因为它不能解决这个问题,而是一个不同的问题。每次您想要结帐到先前的提交时,使用此存储解决方案,您实际上“保存”了数据,这在这种情况下是非常不必要的。正确且更优雅的方式是(如前所述)只结帐