尽管Git本质上是监控和跟踪文本的变化,但它的定位仍然是版本控制系统。您可能以某种方式使用过git;由于其分布式特性,与集中式ApacheSubversion(SVN)相反,git已成为代码版本控制的事实标准。安装Git要检查Git是否安装在终端中,运行:gitversion#gitversion2.25.1https://git-scm.com/downloadsUbuntu用户可以使用apt安装:sudoaptinstallgit。配置Git,我们需要配置的东西不多:gitconfig--globaluser.name"JohnDoe"&yournamegitconfig--globaluser.emailjohndoe@example.com&youremailgitconfig--globalinit.defaultbranchmain#defaultbranchname,tobecompatiblewithGitHub可以查看当前一种通过以下方式全局配置:gitconfig--global--list#Type":q"toclosegit以明文方式存储配置,当然你也可以直接在~/.gitconfig或~/.config/中编辑全局配置混帐/配置。删除--global将使这些命令的范围限定为当前文件夹,如命令所建议的那样。为了对此进行测试,我们需要一个存储库。创建新存储库存储库只是一个文件夹,其中包含您要跟踪的所有内容。要创建存储库,请运行:mkdirgitexample&&cdgitexample&&gitinit#gitexamplegit:(main)此命令会在gitexample文件夹中创建文件夹.git。隐藏的.git文件夹是一个存储库:所有本地配置和更改都存储在那里。进行一些更改让我们在存储库中创建一些东西:echo"Hello,Git">>hello.txt如果我们运行gitstatus我们将看到新创建的未跟踪文件:gitstatus#Onbranchmain##Nocommitsyet##Untrackedfiles:#(use"gitadd..."toincludeinwhatwillbecommitted)#hello.txt##nothingaddedtocommitbutuntrackedfilespresent(use"gitadd"totrack)接下来我们添加文件,可以直接这样:gitadd.#或者`gitaddhello.txt`,如果我们不想要所有文件的话现在检查存储库状态,您会看到文件已添加(也称为暂存),但尚未提交:gitstatus#Onbranchmain##Nocommitsyet##ChangestobeCommitted:#(use"gitrm--cached..."tounstage)#newfile:hello.txt记录修改,先提交:gitcommit-m"Addhello.txt"#[main(root-commit)a07ee27]Addshello.txt#1filechanged,2insertions(+)#createmode100644hello.txt提示:gitcommit-m是一个速记命令,你也可以使用gitcommit打开编辑器(主要是vim)并提供提交的详细描述。让我们检查更改日志:gitlog#type:qtoclose将显示如下内容:commita07ee270d6bd0419a50d1936ad89b9de0332f375(HEAD->main)Author:YourNameDate:SunJul1111:47:162021+0200Addshello.txt(END)创建分支在许多情况下,拥有初始代码的单独版本可能很有用:例如,在测试未定义的功能时,也可以避免一起工作时的代码冲突。这就是git分支的用武之地:它是从特定的历史点发展而来的。要创建分支,您可以运行gitbranchNAME,要切换分支,您可以运行gitcheckoutNAME。或者简单地这样做:gitcheckout-bdev#switchestoanewbranchcalled"dev"#Switchedtoanewbranch'dev'#gitexamplegit:(dev)让我们在hello.txt文件中更改一些内容并提交更改:echo"\nHello,GitBranch">>hello.txt&&gitcommit-am"Changehello.txt"现在让我们切换回主版本:gitcheckoutmain&&cathello.txt#Switchedtobranch'main'#Hello,Git可以看到,文件内容还是和之前一样。要比较分支,我们可以运行:gitdiffdev#diff--gita/hello.txtb/hello.txt#index360c923..b7aec52100644#---a/hello.txt#+++b/hello.txt#@@-1,3+1@@#Hello,Git#-#-Hello,GitBranch#(END)#type":q"toclose让我们也对主分支进行更改:echo"\nHifromMainBranch">>hello。txt&&gitcommit-am"Changehello.txtfrommain"#[main9b60c4b]Changehello.txtfrommain#1filechanged,2insertions(+)现在让我们尝试合并更改:gitmergedev#Auto-merginghello.txt#CONFLICT(content):Mergeconflictinhello.txt#Automaticmergefailed.fixenconflictsandth因为文件在同一个地方改了两次,有冲突。看文件:cathello.txt<<<<<<>>>>>>dev还有一个工具可以单独查看变化:gitdiff--ours#:qtoclosegitdiff--theirs#:qtoclose您可以手动编辑文件并提交更改,但这假设我们只需要一个版本。我们首先中止合并:gitmerge--abort并使用他们的策略重新启动合并,这意味着在发生冲突的情况下我们将始终使用传入分支的内容:gitmerge-Xtheirsdev#Auto-merginghello.txt#Mergemadebythe'recursive'strategy.#hello.txt|5+----#1filechanged,1insertion(+),4deletions(-)这个策略的反面是我们的策略。将两个更改合并在一起需要手动编辑(或使用gitmergetool)。要查看所有分支的列表,请运行:gitbranch#type:qtoclose#dev#*main最后,这里是删除分支的方法:gitbranch-ddev#Deletedbranchdev(was6259828)。Rebase命令分支“从特定点增长到githistory"",rebase命令允许更改这些特定点。让我们创建另一个分支并再次向hello.txt添加一些更改:gitcheckout-bstory&&echo"Onceuponatimetherewasafile">>story.txt&&gitaddstory.txt&&gitcommit-m"Addstory.txt"#Switchedtoanewbranch'story'#[storyeb996b8]Addstory.txt#1filechanged,1insertion(+)#createmode100644story.txt现在,让我们回到主分支并添加更改:gitcheckoutmain&&echo"Otherchanges">>changes.txt&&gitaddchanges.txt&&gitcommit-m"Addchanges.txt"重现我们所做的到main中的故事分支要进行更改,请运行:gitcheckoutstory&&gitrebasemain#Successfullyrebasedandupdatedrefs/heads/story。可以看到在主分支中创建的新文件被添加到故事分支中:ls#changes.txthello.txtstory.txt注意:不要rebase别人可能使用过的分支,比如master分支。另外,请记住,远程存储库上的每个历史操作都需要强制这些更改生效。远程存储库如果您还没有存储库,请创建一个GitHub帐户,登录并创建一个新的空存储库(私有或公共)。假设存储库名称是example,运行以下命令(替换您自己的用户名):gitremoteaddoriginit@github.com:USERNAME/example.git&&gitpush-uoriginmain您可以刷新页面并查看master分支中的文件。要将所有本地分支推送到远程存储库,请运行:gitpush--allorigin让我们在GitHub上编辑一些东西:单击任何文件和铅笔图标。您可以使用一行代码添加任何您想要的文本,然后按Commitchanges。现在在本地运行此命令以获取远程更改:gitcheckoutmain&&gitpull管理未提交的更改以下命令检查、应用或放弃这些更改:gitstashlist#stash@{0}:WIPonmain:92354c8Updatechanges.txtgitstashpop#toapplychangesgitstashdrop#todropchanges提示:您可以使用存储编号,即gitstashpop0应用特定存储或删除它通过gitstashdrop0。如果你想放弃所有本地更改并简单地将存储库恢复为上次提交的更改,请运行:gitrestore。管理提交的更改创建提交后,此更改将保存在本地git历史记录中。如前所述,所有影响远程历史的更改都需要gitpush--force。以下所有命令都值得记住。让我们从编辑最后一条提交消息开始:gitcommit--amend#type:wqtosaveandclose#Press"i"编辑,"Esc"停止编辑我们如何将所有内容重置为开头?要查找第一个提交的ID,请运行此命令并滚动(向下箭头)到末尾:gitlog--abbrev-commit#commita07ee27#Author:YourNameDate:SunJul1111:47:162021+0200Addshello.txt(END)#type":q"toclose现在重置存储库,但保持所有更改未暂存:gitreset--softCOMMIT#e.g.a07ee27与此相反,您还可以使用gitreset--hardCOMMIT强制重置和摆脱所有的变化。您可以从git文档中了解其他几种类型的重置。别名大多数时候,您只会使用少数几个命令(在大多数情况下,checkout、add、commit、pull、push和merge),但多了解一些命令总是好的。另一种方法是git别名。要配置别名,只需在配置中设置即可。例如,我经常使用的别名是gittree,它将漂亮的历史日志打印为树:gitconfig--globalalias.tree'log--graph--decorate--pretty=oneline--abbrev-commit'#TryitwithAnother`gittree`的有用别名是删除所有合并的分支:gitconfig--globalalias.clbr'!gitbranch--merged|grep-v\*|xargsgitbranch-D'如您所见,它使用!作为前缀,这允许我们使用其他命令,而不仅仅是git命令。今天就到这里,希望对您的开发之旅有所帮助。