我有一个主分支,我有几个月的网站项目提交。
我有时需要在过去的某个点通过浏览器查看网站的外观。
我目前检查主分支,选择时间点并创建分支。然后,我可以在浏览器中看到该网站。
我应该这样做,还是有更简单的方法呢?
答案 0 :(得分:2)
您的方法是实现目标的方法之一。 有几种方法可以更快地到达那里(只是一点点)。
如果您有某种Web UI来查看存储库和关联的提交(例如,如果您的存储库托管在GitHub或BitBucket上),您可以找出提交SHA1哈希并通过哈希执行检出。命令是:
git checkout <sha1>
如果您对相对于某个时间点的状态感兴趣,可以使用简单命令首先找到“最接近”的提交哈希,然后将其检出。例如,如果您需要查看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
最后,如果你知道某个提交代表了这些时间点之一,你将来需要/想要再回来,你可以稍后使用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
指向C
,C
指回B
,指向A
。 A
是有史以来第一次提交,因此它不能进一步指向,并且不会。这就是git log
知道停止的方式!
通常,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以获取更多命名提交的方法。