当前位置: 首页 > Linux

在Linux系统下安装Gitbash和使用Git

时间:2023-04-06 01:47:05 Linux

使用git命令非常方便。Git是目前世界上最先进的分布式版本控制系统。SVN和Git的主要区别是什么?  SVN是一个集中式版本控制系统。版本库集中在中央服务器上,工作时使用的是自己的电脑,所以必须先从中央服务器上获取最新版本,然后才能工作,完成后需要将自己所做的工作推送到中央服务器。集中式版本控制系统必须连接到互联网才能工作。如果在局域网内还可以,带宽够大,速度够快。如果是在Internet下,网速慢的话,会很混乱。  Git是一个分布式版本控制系统,所以它没有中央服务器。每个人的电脑都是一个完整的版本库。这样工作的时候就不用联网了,因为版本都在自己的电脑上。.既然每个人的电脑都有一个完整的存储库,那么多人如何协作呢?比如你在自己的电脑上改了文件A,别人在你的电脑上改了文件A,这时候,你们两个只需要把自己的改动推送给对方,就可以看到对方的改动了。从官网下载Git,按顺序安装Git,输入gitconfig--globaluser.name""gitconfig--globaluser.email""以用户名和email为标识,然后使用常用Git命令gitinit在本地新建一个repo,进入一个项目目录,执行gitinit,会初始化一个repo,并在当前文件夹下创建一个.git文件夹。gitclone获取一个url对应的远程Gitrepo,并创建一个本地副本。一般格式为gitclone[url]。克隆的repo将以url的最后一个斜杠命名,并创建一个文件夹。如果要指定具体名称,可以用gitclone[url]newname指定。gitstatus查询仓库的状态。gitstatus-s:-s表示short,-s的输出标志会有两列,第一列是暂存区,第二列是工作目录。gitlog显示一个分支的提交历史。gitlog--oneline--number:每条日志只显示一行,显示数字条。gitlog--oneline--graph:可以图形化显示分支合并的历史。gitlogbranchname可以显示特定分支的日志。gitlog--onelinebranch1^branch2,可以查看分支1的commit,不能查看分支2的commit。^表示排除该分支(Windows下^branch2可能需要加引号)。gitlog--decorate会显示标签信息。gitlog--author=[authorname]可以指定作者的提交历史。gitlog--since--before--until--after根据提交时间过滤日志。--no-merges可以排除合并的提交。gitlog--grep根据提交信息过滤日志:gitlog--grep=keywordsgitlog--grep--author默认是OR关系,即满足一个就返回。如果你希望它们是AND关系,你可以添加--all-match选项。gitlog-S:通过引入的差异进行过滤。例如:gitlog-SmethodName(注意S和后面的词之间没有等号)。gitlog-p:显示每次提交时引入的补丁。每个提交都是一个快照(snapshot),Git会为每个提交计算差异并将其作为补丁显示给你。另一种方法是gitshow[SHA]。gitlog--stat:显示每次提交时引入的更改的差异统计。也可以使用来查看变化的相关信息,--stat比-p的输出更简单。gitadd在提交之前,Git有一个暂存区(stagingarea),可以放新添加的文件或者添加新的更改。commit时提交的变更是上次添加到暂存区的变更,不是我们磁盘上的变更。gitadd会递归地添加当前工作目录下的所有文件。gitdiff不带参数的gitdiff:显示未暂存更改的差异。该命令比较工作目录下当前文件与暂存区快照的差异,即修改后未暂存的变化。要查看已经暂存的文件和上次提交时的快照的区别可以使用:gitdiff--cached命令。显示分阶段更改的差异。(Git1.6.1及之后的版本也允许使用gitdiff--staged,效果是一样的)。gitdiffHEAD显示所有暂存或未声明更改的差异。也就是将woking目录与上次进行对比提交之间的所有更改。如果想查看自某个版本以来发生了什么变化,可以使用:gitdiff[versiontag]和log命令一样,diff也可以添加--stat参数来简化输出。gitdiff[branchA][branchB]可以用来比较两个分支。它实际上会返回一个从A到B的补丁,这不是我们想要的结果。一般我们想要的结果是两个分支分开后的变化是什么,由命令给出:gitdiff[branchA]...[branchB]。实际上它是gitdiff$(gitmerge-base[branchA][branchB])[branchB]的结果。gitcommitCommithasbeenAddthechangesinthecommitmessagegitcommit-m"thecommitmessage"gitcommit-a会先把跟踪文件的所有变化都加进去,然后再提交(有点像svn提交,不需要先暂存)。对于没有track的文件,还是需要gitadd才行。gitcommit--amend补充提交。将以与当前提交节点相同的父节点进行新的提交,旧的提交将被取消。gitreset撤消更改和提交。这里的HEAD关键字指的是当前分支末尾的最新提交。即,存储库中分支上的最新版本。gitresetHEAD:unstagefilesfromindexandresetpointertoHEAD这个命令用来把不小心添加的文件从staged状态中取出来,可以单独对某个文件进行操作:gitresetHEAD--filename,this--也可以省略。gitreset--soft将HEAD移动到特定的提交引用,索引和暂存区保持不变。gitreset--hardunstage文件并撤消自上次提交以来工作目录中的ny更改。使用gitreset--hardHEAD进行重置,即在上次提交后,所有暂存更改和工作目录中的更改都会消失,恢复到上次提交时的状态。这里的HEAD可以写成任何提交的SHA-1。不带软硬参数的gitreset其实是把default参数混合了。总结:gitreset--mixedid改变了git的HEAD(即提交记录改变),但是文件没有改变,(即工作树没有改变)。commit和add的内容被取消。git重置--softid。其实gitreset--mixedid之后,git又做了一次add。也就是取消commit的内容。gitreset--hardid。它改变了git的HEAD,文件也改变了。修改顺序如下:soft(commit)这个命令会用HEAD中的最新内容替换你工作目录中的文件。已添加到临时存储区的更改和新文件不会受到影响。注意:gitcheckoutfilename会删除文件中的所有非临时文件保存并提交修改,这个操作是不可逆的。gitmerge合并一个分支到当前分支。gitmerge[alias]/[branch]将远程分支合并到当前分支。如果有冲突,需要手动修改,可以使用gitmergetool。解决冲突时可以使用gitdiff。解决后用gitadd添加,说明冲突已经解决了。gittag标记历史上的一个点作为导入。提交时会创建一个永久书签,通常是在发布一个releaseversion或shipsomething后添加一个tag。例如:gittagv1.0gittag-av1.0,-a参数会让你添加一些信息,也就是做一个带注释的标签。当你运行gittag使用-a命令时,Git会打开一个编辑器供你输入标签信息。我们可以使用commitSHA来标记一个过去的提交:gittag-av0.9XXXXpush不包含标签,如果要包含,可以在推送的时候加上--tags参数。抓取时,自动抓取分支头能到达的标签,分支头不能到达的标签将被跳过。如果要确保包含所有标签,则需要添加--tags选项。git远程列出、添加和删除远程存储库别名。因为不需要每次都使用完整的url,Git为每个远程repourl创建一个别名,然后使用gitremote来管理列表。gitremote:列出远程别名。如果你克隆了一个项目,Git会自动添加原来的url,别名叫做:origin。gitremote-v:可以看到每个别名对应的实际url。gitremoteadd[alias][url]:添加一个新的远程仓库。gitremoterm[alias]:删除现有的远程别名。gitremoterename[旧别名][新别名]:重命名。gitremoteset-url[alias][url]:updateurl可以加上--push和fetch参数,为同一个别名设置不同的访问地址。gitfetch从远程仓库下载新的分支和数据。你可以gitfetch[alias]来获取某个远程repo,也可以gitfetch--allgetallrepofetch会获取你本地没有的所有数据,所有获取到的分支都可以称为远程分支,它们是和本地分支一样(你可以看到diff、log等,或者合并到其他分支),但是Git不允许你检出它们。gitpullfetch从远程repo并尝试合并到当前分支。pull==fetch+mergeFETCH_HEADgitpull会先执行gitfetch,然后执行gitmerge,将fetched的分支head合并到当前分支。此合并操作将生成一个新的提交。如果使用--rebase参数,它会执行gitrebase来代替原来的gitmerge。gitrebase--rebase不会产生合并提交,它会将所有本地提交暂时保存为补丁放在“.git/rebase”目录下,然后更新当前分支到最新的分支提示,最后应用保存的补丁到分支。在rebase过程中,可能会出现冲突,Git会停止rebase,让你解决冲突。解决冲突后,使用gitadd更新这些内容,之后不需要执行commit,只需要:gitrebase--continue会继续应用剩余的补丁。gitrebase--abort会终止rebase,当前分支会回到rebase之前的状态。gitpush将您的新分支和数据推送到远程存储库。gitpush[alias][branch]会将当前分支合并到alias上的[branch]分支。如果分支已经存在,它将被更新。如果它不存在,它将被添加。.如果多个人将代码推送到同一个远程仓库,Git将首先在您尝试推送的分支上运行gitlog以检查您是否可以在服务器历史记录中看到该分支的当前提示,如果不在本地历史记录中去服务器提示,提示本地代码不是最新的,Git会拒绝你的push,让你先fetch,merge,再push,保证所有改动都被采纳帐户。gitrefloggitreflog是对reflog的管理命令,reflog是git用来记录引用变化的一种机制,比如记录分支变化或者HEAD引用变化。当gitreflog没有指定引用时,默认列出HEAD的reflog。HEAD@{0}表示HEAD的当前值,HEAD@{3}表示HEAD在3次变化前的值。Git会将变化记录在HEAD对应的reflog文件中,其路径为.git/logs/HEAD,分支的reflog文件都放在.git/logs/refs目录下的子目录中。特殊符号:^代表父提交,当一个提交当有多个父提交时,可以在^后面加一个数字表示是哪个父提交:^相当于^1。~相当于连续的^。