如何在分支上的任何给定git提交中查看代码的状态?

时间:2017-03-16 02:35:23

标签: git git-branch

我有一个主分支,我有几个月的网站项目提交。

我有时需要在过去的某个点通过浏览器查看网站的外观。

我目前检查主分支,选择时间点并创建分支。然后,我可以在浏览器中看到该网站。

我应该这样做,还是有更简单的方法呢?

4 个答案:

答案 0 :(得分:2)

您的方法是实现目标的方法之一。 有几种方法可以更快地到达那里(只是一点点)。

  1. 如果您有某种Web UI来查看存储库和关联的提交(例如,如果您的存储库托管在GitHub或BitBucket上),您可以找出提交SHA1哈希并通过哈希执行检出。命令是:

    git checkout <sha1>
    
    1. 如果您对相对于某个时间点的状态感兴趣,可以使用简单命令首先找到“最接近”的提交哈希,然后将其检出。例如,如果您需要查看2017年3月1日代码的状态,您实际上对03/01/2017 00:00之前发生的最新提交感兴趣。命令是:

      git checkout `git rev-list -n 1 --before="2017-03-01 00:00" master
      

      重要的是要提到,如果您在Windows上运行,则需要使用稍微不同的语法。这是相同代码的PowerShell版本:

      $sha = git rev-list -1 --before="2017-03-01 00:00" master
      git checkout $sha
      
      1. 最后,如果你知道某个提交代表了这些时间点之一,你将来需要/想要再回来,你可以稍后使用Git标记功能和结帐标记。例如,要标记提交,您可以运行(使用提交哈希替换sha1 ):

        git tag -a some-point-in-time <sha1>
        

        当你想“回到”这个时间点时,你可以运行:

        git checkout -b master some-point-in-time
        

答案 1 :(得分:1)

运行git status将为您提供分支的当前状态。分阶段文件,未分级修改文件,无论是在rebase / merge中间等等

要在开发过程中持续查看网站,我建议您使用本地服务器在本地为您提供网站服务,在这里您可以refresh浏览器查看更改。

一种流行的方式(也在Github Pages上使用)通过Jekyll为网站提供服务。

答案 2 :(得分:1)

您可以在特定的早期提交中签出master分支,例如

git checkout <SHA-1 of some commit in master>

这将使您进入分离的HEAD状态。从这里开始,您可以实际构建项目,部署并查看它的外观。

如果您想从之前的提交中创建一个真正的分支,您可以通过以下方式创建:

git checkout -b new_branch_from_old_commit

最有可能的是,您不需要创建新分支。当您完成环顾四周时,只需将其检出即可返回当前的master分支:

git checkout master

答案 3 :(得分:0)

您可以通过其哈希ID简单地git checkout提交,但这会给您带来可怕的&#34;分离的HEAD&#34;。

背景

分支和标记是命名某些特定提交的方法。就此而言,HEAD只是命名分支的一种方式,有时也是一种特定的提交。

因此:

git log

显示您从HEAD开始提交,并且:

git log master

显示您从master开始提交。如果HEAD命名master,则这两者完全相同。

添加--oneline,或者我喜欢&#34; DOG&#34; - --decorate --oneline --graph;还要考虑&#34; DOG&#34;,--all --decorate... - 稍微压缩输出:

* e0688e9 (HEAD -> master, origin/master, origin/HEAD) git svn: fix ...
* 3bc5322 First batch after 2.12
* 3e5c639 Merge branch 'rl/remote-allow-missing-branch-name-merge'

我们在此处看到HEAD名称为master,并且还有两个名称用于提交e0688e9

每个提交都命名一个先前的提交(其父提交)。这是 git log如何能够显示多个提交。我们说分支和标记名称​​指向类似e0688e9的提交,并且该提交指向其前一个3bc5322,它指向另一个,依此类推

如果我们将这些提取作为一系列单字母提交(比3bc5322...哈希ID更加易于使用),我们会得到如下内容:

A <- B <- C   <-- master

此处,名称master指向CC指回B,指向AA是有史以来第一次提交,因此它不能进一步指向,并且不会。这就是git log知道停止的方式!

分离的HEAD

通常,HEAD包含实际的分支名称。在上面的git log输出中,我们看到HEAD名为master。这样做的:

git checkout branch

告诉Git不仅要检查branch名称的具体提交,还要将名称 branch放入HEAD。我们说HEAD是附加到分支。但我们可以通过将原始哈希ID放入HEAD分离,我们通过运行来完成:

git checkout 3bc5322

这与在那里有一个分支名称相同,除了 ...

新提交移动分支

当您进行 new 提交时,Git将新提交写回指向当前提交,然后更改当前分支以使其指向新提交。例如,如果我们向我们的三次提交D设置添加新的提交A-B-C,则提交本身就是这样的:

A <- B <- C <- D

但是D的名字是那些丑陋的哈希ID之一,我们无法记住这一点。相反,我们让Git记住它 - 通过将它写入当前分支的名称。如果当前分支为master,则会更改master,使其不再指向C

A <- B <- C <- D   <-- master

现在master为我们记住D,分支本身已经成长!

但是,问题在于:Git知道要更新哪个分支的方式是它存储在HEAD中。如果您有一个分离的HEAD,则没有当前分支名称。在这种情况下,Git会记住新提交HEAD。假设我们在通过哈希ID签出D时添加B

A--B--C     <-- master
    \
     D      <-- HEAD

如果我们git checkout master,则会使用名称HEAD覆盖master,&#34;忘记&#34;我们的新提交。

这不是真的很危险,除非它可能是:也许你写了一些非常好的代码,你会never be able to write again,现在你已经失去了它,哦不!因此,为此目的,您可以使用git checkout -b在任何提交创建新的分支名称 包括分离的HEAD:

git checkout -b newbranch

现在我们有:

A--B--C     <-- master
    \
     D      <-- newbranch (HEAD)

或者,当然,您可以给提交B一个标签,然后检查它,然后进行新的提交D。这里的要点是它真正重要的是提交;名称只是给我们找到它们的方法

命名提交的方法有很多种

您可以使用分支和标记名称,但可以添加后缀和计数:

HEAD~1
例如,意味着&#34;从HEAD开始,然后再回到HEAD的父母&#34;。 (如果提交是合并提交 - 带有多个父级的一个 - ~后缀每次都会选择第一个父级。)或者,您可以将@{...}HEAD或分支名称一起使用:

master@{1.week.ago}

使用Git为master调用 reflog 的内容来查看一周前提到的提交master(如果那是你多次改变它的那一天,Git精确到7 * 24 * 60 * 60秒之前; Git在这里很简单。

还有很多其他方法可以查找提交,包括在commit messages 中搜索文本。研究the gitrevisions documentation以获取更多命名提交的方法。