git 还原文件到其他版本
读:
在今天的文章中,您将学习如何确定您在项目历史中的位置,如何还原较旧的文件版本以及如何创建Git分支,以便可以安全地进行野性实验。
您在Git项目的历史中所处的位置,就像您在摇滚专辑中的位置一样,由称为HEAD的标记(例如磁带录音机或录音机的播放头)确定。 要在自己的Git时间轴中移动HEAD,请使用git checkout
命令。
有两种使用git checkout
命令的方法。 通常的用途是从先前的提交中还原文件,还可以倒回整个磁带盘并朝完全不同的方向前进。
当您意识到您已经完全销毁了本来不错的文件时,就会发生这种情况。 我们都这样做; 我们将文件放到一个好地方,添加并提交,然后我们决定它真正需要的是最后一次调整 ,文件最终变得完全无法识别。
要将其恢复到以前的荣耀,请使用最后一次已知提交的git checkout
: HEAD
:
$
git checkout HEAD filename
如果您不小心提交了错误的文件版本,并且需要从更远的时间撤回该版本,请查看Git日志以查看先前的提交,然后从适当的提交中将其检出:
$
git log
--oneline
79a4e5f bad take
f449007 The second commit
55df4c2 My great project, first commit.
$
git checkout 55df4c2 filename
现在,该文件的旧版本将还原到当前位置。 (您可以随时使用git status
命令查看当前状态。)由于文件已更改,因此需要添加文件,然后提交:
$
git add filename
$
git commit
-m
'restoring filename from first commit.'
查看您的Git日志以验证您做了什么:
$
git log
--oneline
d512580 restoring filename from first commit
79a4e5f bad take
f449007 The second commit
55df4c2 My great project, first commit.
从本质上讲,您已经倒带了,并且正在收录不好的东西。 因此,您需要重新记录好成绩。
检出文件的另一种方法是倒回整个Git项目。 这引入了分支的概念,从某种意义上说,分支是同一首歌的另一种选择。
当您返回历史记录时,可以将Git HEAD倒带到项目的先前版本。 该示例一直回退到原始提交:
$
git log
--oneline
d512580 restoring filename from first commit
79a4e5f bad take
f449007 The second commit
55df4c2 My great project, first commit.
$
git checkout 55df4c2
当您以这种方式倒带时,如果按下“录音”按钮并继续前进,则将破坏您的未来工作。 默认情况下,Git假定您不想执行此操作,因此它会将HEAD与项目分离,并允许您根据需要进行工作,而不会意外地记录以后记录的内容。
如果您查看以前的版本,突然意识到您想重新做所有事情,或者至少尝试其他方法,那么这样做的安全方法是创建一个新分支。 您可以将这一过程视为尝试播放同一首歌曲的不同版本或创建混音。 原始材料已经存在,但是您正在分支并制作自己的版本以娱乐。
要将Git HEAD放回空白磁带上,请建立一个新分支:
$
git checkout
-b remix
Switched to a new branch
'remix'
现在,您可以回到过去,并拥有一个备用且整洁的工作空间,可以随时进行任何更改。
您可以做同样的事情而无需及时移动。 也许您对自己的进度非常满意,但是想切换到临时工作区只是为了尝试一些疯狂的想法。 这也是一个完全可以接受的工作流程:
$
git status
On branch master
nothing to commit, working directory clean
$
git checkout
-b crazy_idea
Switched to a new branch
'crazy_idea'
现在您有了一个干净的工作区,可以在其中沙沙一些疯狂的新想法。 完成后,您可以保留更改,也可以忘记更改的存在并切换回主分支。
为了让您的想法丢脸,请改回主分支并假装新分支不存在:
$ git checkout master
为了保留您的疯狂想法并将它们拉回到您的master分支,请更改回您的master分支并合并您的新分支:
$
git checkout master
$
git merge crazy_idea
分支是git的强大功能,对于开发人员来说,在克隆存储库后立即创建新分支是很常见的。 这样,他们的所有工作都包含在自己的分支中,他们可以提交并合并到master分支。 Git非常灵活,因此没有“正确”或“错误”的方式(即使是master分支也可以与它所属的远程对象区分开),但是分支使分离任务和贡献变得容易。 别太着迷,但是在您和我之间,您可以根据需要拥有任意数量的Git分支。 他们是免费的!
到目前为止,您已经在自己家中的舒适和私密环境中维护了一个Git存储库,但是当您与其他人一起工作时呢?
有几种不同的设置Git的方法,以便许多人可以同时处理一个项目,因此,无论您是从某人的个人Git服务器还是从其GitHub页面上获得该克隆,现在我们都将重点放在克隆上。来自同一网络上的共享驱动器。
使用自己的私有Git存储库和要与他人共享的内容之间的唯一区别是,在某个时候,您需要push
更改push
送到其他人的存储库。 我们称您正在本地存储库中工作的存储库,将其他任何存储库称为remote 。
当你从另一个源克隆具有读写权限的资源库,你克隆从那里来作为它的起源继承了遥控器。 您可以看到克隆的遥控器:
$
git remote
--verbose
origin seth
@ example.com:~
/ myproject.Git
( fetch
)
origin seth
@ example.com:~
/ myproject.Git
( push
)
具有远程起源很方便,因为它在功能上是异地备份,并且还允许其他人从事该项目。
如果您的克隆没有继承远程原点,或者您选择稍后添加,请使用git remote
命令:
$ git remote add seth @ example.com:~ / myproject.Git
如果您已更改文件并希望将其发送到远程origin
,并且对存储库具有读写权限,请使用git push
。 第一次推送更改时,还必须发送分支信息。 最好不要使用master,除非您被告知要这样做:
$
git checkout
-b seth-dev
$
git add exciting-new-file.txt
$
git commit
-m
'first push to remote'
$
git push
-u origin HEAD
这会将您的当前位置(自然是HEAD) 及其存在的分支推送到远程服务器。 推送分支一次后,可以删除-u
选项:
$
git add another-file.txt
$
git commit
-m
'another push to remote'
$
git push origin HEAD
当您在Git存储库中独自工作时,可以随时将测试分支合并到您的master分支中。 与贡献者协同工作时,您可能需要先查看它们的更改,然后再将其合并到master分支中:
$
git checkout contributor
$
git pull
$
less blah.txt
# review the changed files
$
git checkout master
$
git merge contributor
如果您使用的是GitHub或GitLab或类似工具,则过程会有所不同。 在那里,传统上是将项目进行分叉并将其视为您自己的存储库。 您可以在存储库中工作,并将更改发送到GitHub或GitLab帐户,而无需任何人的许可,因为它是您的存储库。
如果您希望派遣它的人接收更改,则可以创建一个拉取请求 ,该请求使用Web服务的后端将补丁发送给真正的所有者,并允许他们查看并拉入您的更改。
分支项目通常是在Web服务上完成的,但是用于管理项目副本的Git命令是相同的,即使是push
过程也是如此。 然后将其返回到Web服务以打开请求请求,然后完成工作。
在下一部分中,我们将介绍一些便利的附件,以帮助您将Git舒适地集成到日常工作流程中。
翻译自: https://opensource.com/life/16/7/how-restore-older-file-versions-git
git 还原文件到其他版本