Git简记
本文从Git的命令入手,根据不同的应用场景,对每个命令都会有简单的说明(若有变化,请以官方说明为主)。
Git初始化:
$ git init
本命令会初始化这个Git仓库,通过命令$ ls -a 可以看到多出了一个.git目录(文件夹,以下简称为目录,即以Unix说法为主)。这个.git目录中包含了这个Git仓库中相关Git的信息。
$ git config --global user.name "User's name"
$ git config --global user.email "email-account@example.com"
本命令会配置Git仓库的User的基本信息,其信息存储在 HOME 目录下的.gitconfig配置文件中。
Git文件提交:
$ git add <fileName> <fileName1> <......>
将文件fileName提交到暂存区,这时的工作区内容会被转移到暂存区,此时仍可以在工作区继续修改创建,再通过本命令将文件提交(转移)至暂存区。
$ git commit -m "information of the commit"
将暂存区中的文件提交到本地Git仓库,这时的文件可以说是真正意义上被存储下来,因为日后若有需要,通过这个记录可以对文件进行恢复。
Git查看:
$ git status
随时可以通过本命令来查看Git工作区和暂存区的状态,例如可以看有哪些文件是新创建的,哪些文件是被修改过的。
$ git diff <fileName>
查看文件之间的差异,例如不同文件之间增添了哪些内容,删除了哪些内容(本命令显示的内容同Unix下的diff命令显示内容格式相同)。
$ git log
查看历史commit提交记录,其内容包括提交作者<邮箱>,提交时间,提交说明(commit -m)以及commitID(其标号唯一确定,便于找回)。
显示模式为Unix下more命令显示格式(按q退出浏览,按space翻篇浏览,按Enter逐行浏览)。
通过添加参数选项--pretty=oneline可以将内容简洁化,即浏览方式为单行浏览,从而使内容简洁,便于浏览。
$ git reflog
查看Git仓库中的历史命令。
Git撤销修改:
$ git reset --hard HEAD^
将文件恢复至上一个已提交版本。
若要恢复上上次提交版本,输入命令 $ git reset --hard HEAD^^,恢复至前一百次版本 $ git reset --hard HEAD~100。
$ git reset --hard <commitID>
将文件恢复至commitID版本,本命令可以结合着 $ git log 和 $ git reflog 命令来使用,方便恢复版本更改。
$ git checkout -- <fileName>
丢弃工作区的文件修改,这时会有两种情况:
① 若此时暂存区中有相应文件,则从暂存区中将该文件恢复至工作区。
② 若此时暂存区中没有响应文件,则从本地仓库中按照最新提交的该文件内容进行恢复,并恢复至工作区。
应用场景:想直接放弃对工作区文件的修改,重新进行修改。
$ git reset HEAD <fileName>
把已经暂存在暂存区的文件撤销暂存,重新放回到工作区。
应用场景:不小心把不该提交的文件放到了暂存区,通过本命令撤销暂存。
注:若不小心将不该提交的文件提交了(commit),可通过版本恢复,重新对文件进行修改。
$ git rm <fileName> <fileName1> <......>
在Git中删除掉一些文件,注意要在Git仓库中完成删除操作,在本命令之后需要进行一次commit提交。
Git远程连接:
为保证能够建立好远程连接,这里给出SSH传输协议连接方式,远程仓库为GitHub的示例说明。
准备工作:
若本机未曾建立过SSH传输,则需要创建SSH密钥:
$ ssh-keygen -t rsa "email-account@example.com"
通过此命令,便得到了SSH密钥,一个为私有密钥(需保密),一个为公开密钥(可公开),密钥文件路径:~/.ssh/
建立连接:
在GitHub中添加SSH公开密钥内容(若无法用打开方式打开密钥内容,试试 $ cat ~/.ssh/id_rsa.pub)。
$ git remote add origin git@github.com:Author/gitname.git
将本地Git仓库添加远程连接的GitHub仓库。
$ git push -u origin master
将master分支内容提交到远程GitHub仓库,此命令之后即可看到GitHub仓库内容同本地Git仓库内容相一致。
此命令为第一次push时使用,在此命令之后,每次需要push时,命令 $ git push origin master 即可。
$ git clone git@github.com:Author/gitname.git
从指定的GitHub仓库中克隆文件/目录到本地Git仓库。
注:
$ git remote -v
查看当前Git仓库所关联的远程仓库。
$ git remote rm origin
删除与名为origin的远程仓库的连接。
$ git pull
从当前Git仓库所绑定的远程仓库中获取目录内容,由此来保证同远程仓库目录内容一致。
Git分支:
$ git branch
查看当前Git仓库中的分支状态(罗列出所有的Git分支,并在当前分支前用'*'来标识)。
$ git branch dev
创建一个分支,分支名为dev。
$ git checkout dev
从当前分支转换到dev分支。
$ git checkout -b dev
创建一个名为dev的分支,并转换到该分支。
$ git merge dev
在master分支上执行此命令时,Git会将dev分支上所做的修改同当前master分支上所做的修改进行合并(注意此时要dev已经commit,来保证文件在dev分支上被修改过)。
此时可能会发生冲突,比如master分支上和dev分支上均对同一文件的同一位置进行了不同的修改,此时merge命令会报错,并且Git会要求解决掉冲突,重新修改文件后,才能正常提交。
需要注意的是,本命令下,Git会执行Fast Forward合并,也就是说,Git会将两个分支的指针移动到一起实现merge,但这样很可能会丢掉dev分支上的工作进度。考虑到这种merge模式的弊端,通过命令 $ git merge --no-ff -m "information of the mrege with no-ff" dev 实现非Fast Forward模式合并。
$ git branch -d dev
删除dev分支。
附:
$ git log --graph --pretty=oneline --abbrev-commit
通过查看分支合并图的方式查看每次提交。
$ git branch -D dev
强行删除一个未曾合并过的分支。
Bug分支(这是分支常见的应用场景之一):
考虑这样一种情况,当正位于dev分支上工作时,接到修复bug的任务,此时既要缓存dev分支工作进度,又要解决掉bug。
方案:①缓存当前工作进度 --> ②转至修复bug提交分支 --> ③创建修复bug的分支并进行修复 --> ④回到修复bug提交分支并将修复版本合并提交 --> ⑤返回dev分支继续工作
① $ git stash
缓存当前工作进度,便于以后恢复工作进度,继续编辑。
② $ git checkout bugLine // 转换到修复bug提交分支
③ $ git checkout -b issue // 创建临时分支来修复bug
④ $ git checkout bugLine // 转换到修复bug提交分支以准备提交修复版本
$ git merge --no-ff -m "Finish Task." issue // 通过非Fast Forward模式进行合并issue分支
$ git branch -d issue // 完成修复bug任务后,删除掉临时创建的issue分支即可
⑤ $ git checkout dev // 返回dev分支
$ git stash list // 列出dev分支缓存列表
方式一:$ git stash apply [stash@{No.}] 进行恢复,然后 $ git stash drop 将该缓存删除。
方式二:$ git stash pop 恢复工作进度的同时,将缓存内容删除。
远程分支提交:
$ git checkout -b dev origin/dev
为便于区分,建议创建远程分支时同远程分支结构相同。
$ git push origin <branchName>
向远程仓库提交自己所修改的分支。
若提交失败,则因为远程分支比本地内容更新,需要用 $ git pull 试图合并。
如果合并有冲突,则解决冲突,并在本地进行提交。
没有冲突或者解决冲突后,再用 $ git push origin <branchName> 推送即可成功。
若 $ git pull 提示"no tracking information",则说明本地分支和远程的分支没有建立连接,用命令 $ git branch --set-upstream <branchName> origin/<branchName>创建分支连接。
Git标签:
$ git tag <tagName>
创建一个新标签,这个标签默认被标记在最新一次的提交上(当前分支)。
$ git tag
查看所有标签。这时所列出的标签不是按照提交时间进行排序的,而是单纯按照标签内容进行字母顺序排序。
$ git tag v0.9 commitID
为commitID的提交创建一个名为"v0.9"的标签。
$ git show <tagName>
查看标签所在的提交的信息。
$ git tag -a v0.1 -m "verson 0.1 released." commit ID
创建带有说明的标签,-a指定标签名,-m指定文字说明。
$ git tag -d v0.1
删除v0.1标签(而非删除该标签所代表的提交)。
$ git push origin <tagName>
推送标签到远程。
$ git push origin --tags
一次性推送全部标签。
注:
若要删除远程标签,先在本地删除,再输入命令 $ git push origin :refs/tags/v0.1
Git配置别名:
$ git config --global alias.st status
此命令后,输入 $ git st 就执行 $ git status 命令。
$ git config --global alias.unstage 'reset HEAD'
此命令后,撤销暂存区修改,执行命令 $ git unstage <fileName> 即可。
$ git config --global alias.last 'log -1'
此命令后,输入 $ git last 可显示最后一次提交信息。
$ git config --global alias.ls "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
丧心病狂... 此命令后,输入 $ git ls 可...可以试试看。
注:
上述的命令都被存储到 HOME 下的.gitconfig配置文件中的 [alias] 块中。以及上述的Author信息都被存储在.gitconfig文件中,故可通过修改该配置文件来自定义自己的Git配置。
声明:
本文章参考了廖雪峰Git教程
其原文链接:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000