在本文中,您将学习如何查看项目中的历史版本,如何回滚版本,以及如何创建Git分支,让您可以大胆尝试没有什么问题。你在Git项目历史中的位置就像摇滚专辑中的一个片段,由一个名为HEAD的标记标识(就像录音机或电唱机的播放头)。要在Git时间轴上来回移动HEAD,请使用gitcheckout命令。有两种方法可以使用gitcheckout命令。最常见的用途是从以前的提交中恢复文件,但您也可以完全倒带并切换到另一个分支。恢复文件是当你意识到一个本来很好的文件已经被你完全搞砸了。我们都这样做过:我们把一个文件放在一个地方,添加它,提交它,然后我们意识到它需要一些他妈的调整,文件被搞得面目全非。为了让它恢复到它的完美状态,使用gitcheckout从***的提交(即HEAD)中恢复:$gitcheckoutHEADfilename如果你碰巧提交了一个错误的版本并且你需要找回一个早期的版本,使用gitlog查看您之前的提交,并从适当的提交中检索它:$gitlog--oneline79a4e5fbadtakef449007Thesecondcommit55df4c2Mygreatproject,firstcommit.$gitcheckout55df4c2filename之前的文件现在已恢复到您的当前位置。(任何时候你都可以使用gitstatus命令来检查你当前的状态)因为这个文件已经改变了,你需要在提交之前添加这个文件:$gitaddfilename$gitcommit-m'restoringfilenamefromfirstcommit.'使用gitlog来验证你的提交:$gitlog--onelined512580restoringfilenamefromfirstcommit79a4e5fbadtakef449007Thesecondcommit55df4c2Mygreatproject,第一次提交。本质上,您已经倒带并修复了坏的,因此您需要重新录制正确的磁带。还原时间线以还原文件的另一种方法是还原整个Git项目。这里使用了分支的思想,这是另一种选择。如果你想回到历史提交,你必须将GitHEAD回滚到以前的版本。此示例将返回到原始提交:$gitlog--onelined512580restoringfilenamefromfirstcommit79a4e5fbadtakef449007Thesecondcommit55df4c2Mygreatproject,firstcommit.$gitcheckout55df4c2当您以这种方式倒带时,如果您按记录重新开始,您将丢失之前的工作。默认情况下,Git假定您不想这样做,因此将HEAD从项目中分离出来可以让您随心所欲地工作,而不会偶尔出现的日志妨碍您以后的工作。如果你想看看以前的版本,想重做或尝试不同的方法,更安全的方法是创建一个新分支。将此过程视为尝试同一首歌曲的不同版本,或创建混音。原来的还在那里,关闭那个分支并制作你想要的版本。就像录制到空白磁带一样,将你的GitHEAD指向一个新分支:工作。也可以在不更改时间线的情况下执行相同的操作。也许您很想这样做,但切换到一个临时工作区只是为了尝试一些疯狂的想法。这在工作中是完全可以接受的,参见:$gitstatusOnbranchmasternothingtocommit,workingdirectoryclean$gitcheckout-bcrazy_ideaSwitchedtoanewbranch'crazy_idea'现在你有了一个干净的工作区,你可以在这里完成一些奇怪的想法。完成后,您可以保留更改,或丢弃它们并切换回主分支。放弃你的想法,切换到你的master分支,并假装新分支不存在:主分支:$gitcheckoutmaster$gitmergecrazy_ideagit的分支功能非常强大,开发人员通常会在克隆存储库后立即创建一个新分支;这样,他们所有的工作都在自己的分支上,可以提交并合并到master分支中。Git是灵活的,所以没有“正确”或“错误”的方式(即使是主分支也可以从它所属的远程分离),但是分支使得分离任务和提交贡献变得容易。不要太兴奋,你可以拥有任意数量的Git分支。完全免费。远程协作到目前为止,您已经在自己家中舒适而私密地维护了一个Git存储库,但是如何与其他人协作呢?有几种不同的方法来设置Git以便多个人可以同时处理一个项目,所以首先我们要克隆repo,你可能已经从某人的Git服务器或GitHub主页克隆了一个repo,或者在LAN中的共享存储。在私有存储库和共享存储库中工作的唯一区别是您需要将更改推送到其他人的存储库。我们称工作仓库为本地(local)仓库,其他仓库称为远程(remote)仓库。当您以读写方式克隆存储库时,克隆的存储库继承自一个名为origin的远程存储库。您可以查看克隆存储库的远程存储库:$gitremote--verboseoriginseth@example.com:~/myproject.Git(fetch)originseth@example.com:~/myproject.Git(push)有一个originremote存储库非常有用,因为它能够异地备份并允许其他人处理该项目。如果clone没有继承origin远程仓库,或者选择以后添加,可以使用gitremote命令:$gitremoteaddseth@example.com:~/myproject.Git修改文件的话,要将它们发送到origin远程库的读写权限,使用gitpush。第一次推送更改时,还必须发送分支信息。最好不要直接在master分支上工作,除非你被要求这样做:当前位置(HEAD)及其现有分支到远程。推送一次后,您不能在后续每次推送时使用-u选项:主分支。与团队协作时,您可能希望在将它们合并到主分支之前检查它们的更改:$gitcheckoutcontributor$gitpull$lessblah.txt###checkchangedfiles$gitcheckoutmaster$gitmergecontributor如果您使用的是GitHub或GitLab以及类似的有些东西,过程是不同的。但是克隆项目并将其用作您自己的存储库是相似的。您可以在本地工作并将更改提交到您的GitHub或GitLab帐户,而无需任何其他人的许可,因为这些存储库是您的。如果你想让你的克隆存储库接受你的更改,你需要创建一个拉取请求(pullrequest),它使用web服务后端将补丁发送给真正的所有者,并允许他们审查和拉取你的更改。克隆一个项目通常是在Web服务器端完成的,类似于使用Git命令来管理项目,甚至是推送的过程。然后它返回到Web服务以打开拉取请求并完成工作。在下一部分中,我们将在Git中集成一些有用的插件,以帮助您轻松完成日常工作。
