Git基础

如何开始用Git呢?

? ? ?可以通过命令行和界面使用Git,但推荐命令行。掌握了命令行,界面也就基本掌握了,反之就不行。
如何创建一个Git仓库呢?
? ? ?有两种方式:
? ? ?第一种针对本地的某个项目,还未被Git记录过,那么cd到对应项目的根目录下,执行
? ? ?$ git init
? ? ?然后执行
? ? ?$ git add *.c
? ? ?$ git add LICENSE
? ? ?$ git commit -m ‘initial project version’
? ? ?后面三句先不解释含义,后面会逐步说明。只说明第一句git init,表示在当前目录下,生成.git仓库来记录该目录下的项目。
? ? ?第二种针对远端的某个项目,有对应项目的公开链接和权限,执行
? ? ?这句命令会在当前目录新建一个名为libgit2的目录,并在其中放置远端同步过来的项目。如果想让目录叫别的名字,执行
? ? ?$ git clone?https://github.com/libgit2/libgit2?mylibgit
? ? ?会让目录叫mylibgit。
如何确定成功初始化了一个Git仓库呢?
? ? ?进入对应项目跟目录下,执行
? ? ?$ git status
? ? ?如果返回On branch master之类的信息,则表明初始化成功。
如何开始用Git记录文件?
? ? ?Git能够识别目录中的文件是已记录(tracked)还是未记录(untracked)。开始记录某个文件,需执行
? ? ?$ git add <filename>
? ? ?执行这句命令会将未记录的文件放入跟进区,文件变为已记录并且处于已跟进状态,等待被提交。
如何跟进已修改的文件?
? ? ?如果一个已记录的文件被修改了,那么跟进的部分仍旧是未修改前的,要想让修改被跟进,那么也需要执行
? ? ?$ git add <filename>
如何查看已记录文件的修改后未跟进与已跟进之间的差异?
? ? ?执行
? ? ?$ git diff
如何查看已记录文件已跟进部分与前一次提交文件之间的差异?
? ? ?执行
? ? ?$ git diff –staged
? ? ?或者执行
? ? ?$ git diff –cached
当执行git status时候,Git总把一些不相关的文件列在未记录的文件中,怎么样能够不看到这些文件,这些文件都不会被记录?
? ? ?Git提供了配置忽略文件(Ignoring Files)的方法,即配置.gitignore文件。该文件的每一行为一项,#开头的行会被当作注释。一行一般被用来配置要屏蔽的某一类文件,语法上支持通配符。https://github.com/github/gitignore中有很多很好的例子可以做参考。配置好的.gitignore文件放在项目根目录下即可。
如何提交修改?
? ? ?执行
? ? ?$ git commit
? ? ?会弹出编辑器让编辑提交的信息。或者直接用-m,即
? ? ?$ git commit -m ‘this is the message’
? ? ?需要注意的是提交的修改都必须是已跟进的内容,如果想跳过跟进的步骤,直接加入-a选项,即
? ? ?$ git commit -a -m ‘this is the message’
? ? ?不过需要明白的一点是,这句命令中被提交的都是已经有过记录的文件,如果是未记录文件,那么是无法提交的。
? ? ?至此git init部分的后三句命令应该都清楚含义了。
如何删除一个文件呢?
? ? ?可以执行
? ? ?$ rm <filename>
? ? ?这种方式仅会从磁盘上删除掉文件,但删除的操作并未被提交,还需要手动跟进提交一次。更容易的方法是执行
? ? ?$ git rm <filename>
? ? ?会直接删除文件并自动做跟进。
如果只是想不跟进这个文件,并不像从磁盘上删除该怎么办?
? ? ?$ git rm –cached <filename>
怎么对跟进的文件重命名呢?
? ? ?$ git mv <before_name> <after_name>
? ? ?等价于执行
? ? ?$ mv <before_name> <after_name>
? ? ?$ git rm <before_name>
? ? ?$ git add <after_name>
提交的流程已经清楚,但要想查看提交历史怎么办?
? ? ?$ git log
?执行这条命令仅能够看到每次提交的校验码、作者、时间、修改的信息,怎么能够看到修改的概况?
? ? ?$ git log –stat
这条命令确实可以看到每次提交删除和新增的概况,不过要看具体的差异怎么办?
? ? ?$ git log -p
要是只想看最近两次的提交呢?
? ? ?$ git log -2
提交历史虽然是按照时间的倒序排列的,但似乎无法知道各个提交之间的继承关系?
? ? ?$ git log –graph
? ? ?实际上git log还有查找特定字段–grep,自定义输出格式–pretty,显示单行–oneline等等一些更加复杂的命令,具体情况可参考Git的帮助手册
有时候查看提交历史后才想起来,有些文件忘记提交了,想覆盖最后一次提交的历史怎么办?
? ? ?$ git commit –amend
? ? ?执行这句命令后,可以重新提交并覆盖最后一次的提交历史,实际上等了解了rebase后可以随意修改自己提交的历史。
有时候提交时错误跟进了一些文件,怎么样能够取消跟进?
? ? ?$ git reset HEAD <file>
有时候想直接放弃某个文件的修改怎么办?
? ? ?$ git checkout — <file>
到目前似乎都只是在讲本地的一些操作,怎么样能够知道远端仓库的信息?
? ? ?$ git remote
? ? ?可以显示有哪些远端的分支
? ? ?$ git remote -v
? ? ?可以显示分支的具体URL,关于分支的概念,在Git分支中会有更详细的说明。
如果有多个远端仓库,怎么添加?
? ? ?$ git remote add <branch_name> <url>
如何获取添加的远端分支的代码?
? ? ?$ git fetch <branch_name>
? ? ?这个操作,仅仅将远端代码同步到本地,不能编辑和修改,也不会自动并入到本地的任何一个分支。如果有某个本地分支在跟踪这个远程分支,直接切换到相应分支,执行
? ? ?$ git pull
? ? ?或者
? ? ?$ git pull -r
? ? ?-r表示以rebase的方式并入本地分支,主要是将远端的提交记录与本地的提交做次序上的先后调整。
如何将本地的代码推送到远端分支?
? ? ?$ git push <remote_branch> <local_branch>
? ? ?或者当前的分支跟踪了远程的分支,直接执行
? ? ?$ git push
前面显示远端分支时候最多就是名字和URL,怎么显示更加详细的信息?
? ? ?$ git remote show <remote_branch>
怎么对远端分支重命名?
? ? ?$ git remote rename <old_name> <new_name>
怎么删除一个远端分支?
? ? ?$ git remote rm <remote_branch>
打标签是记录软件里程碑的重要功能,Git是怎么支持这个特性的?
? ? ?$ git tag
? ? ?可以查看已经打过的标签。标签分含附注的标签和轻量级的标签,打含附注标签的命令是
? ? ?$ git tag -a <tag_version> -m <tag_message>
? ? ?打轻量级的标签的命令是
? ? ?$ git tag <tag_version>
? ? ?查看某个标签的具体情况的命令是
? ? ?$ git show <tag_version>
? ? ?以上打标签的方法都是针对最新一次提交,对历史的某次提交打标签,只需要指定上检验码就好了。另外这些标签在本地打完,并不会被push命令推送到远端,除非显式的指出
? ? ?$ git push <remote_brach> <tag_version>
Git中有些命令似乎很长,但又用得很频繁,有没有办法可以简化?
? ? ?Git提供了异名机制,可以自定义命令,例如
? ? ?$ git config –global alias.co checkout
? ? ?$ git config –global alias.br branch
? ? ?$ git config –global alias.ci commit
? ? ?$ git config –global alias.st status
? ? ?$ git config –global alias.unstage ‘reset HEAD –‘
? ? ?$ git config –global alias.last ‘log -1 HEAD’
这段文字改写自《Pro Git》一书的第二版第二章Basics部分。这里的改写仅用作回顾,不推荐直接学习,原书中有很多图示的说明更加直观。第一章请参考Git初识

发布人

jeremy1990

现居北京,就职于亚马逊中国,软件工程师。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注