日常使用命令
workspace:工作区
index/stage:暂存区
repository:本地仓库
remote:远程仓库
新建版本库
git init
初始化一个 Git
仓库(repository
),即把当前所在目录变成 Git
可以管理的仓库。
git init [project-name]
新建一个目录,将其初始化为Git
仓库。
git clone [url]
从远程库(origin)克隆一份到本地,仓库名同远程仓库名。
添加、提交文件
git add [file1] [file2] ...
把文件添加到暂存区(stage
),可被 track 追踪纪录下来。可多次使用来添加多个文件。
git add [dir]
添加指定目录到暂存区,包括子目录。
git add .
暂存新增加的和修改的文件,不包括已删除的文件。即当前目录下所有文件。
git add -f [file]
强制添加被 .gitignore
忽略的文件到 Git。
git commit -m "本次提交说明"
一次性把暂存区所有文件修改提交到仓库的当前分支。注意:提交信息可为中文也可为英文,若为英文则通常用一般现在时。如果不加参数 -m
则会跳转到编辑器强制填写提交说明信息。
查看状态、修改
git status
显示当前仓库的最新状态。提交之后,工作区就是“干净的”,即没有新的修改;有未提交文件时,最上面显示的是在 staging area
,即将被 commit
的文件;中间显示没有 stage
的修改了的文件,最下面是新的还没有被 Git track
的文件。
git diff
查看工作区中的修改。
git diff [file]
查看指定文件具体修改了哪些内容。
git diff --staged 或 git diff --cached
查看暂存区中的修改。
git diff [commit id1] [commit id2]
比较两次 commit
之间的差异。
git diff [branch1] [branch2]
在两个 branch
之间比较。
git diff HEAD -- [file]
查看版本库最新版本和工作区之间的区别。
查看日志
git log
显示从最近到最远的提交日志,包括每个提交的 SHA-1
校验和、作者的名字和电子邮件地址、提交时间以及提交说明等基本信息。
git log --graph
查看分支合并图。
git log --pretty=oneline
简化日志信息,将每个提交放在一行显示,查看的提交数很大时非常有用,也可带有--graph
参数,效果同git config format.pretty oneline
。
git log --graph --pretty=oneline --abbrev-commit
查看分支的合并情况,包括分支合并图、一行显示、提交校验码缩略显示。
版本回退
git reset --hard HEAD^
回退到上一个版本。同理,回退到上上个版本为:HEAD^^
, 回退到上100个版本为:HEAD-100
,波浪号 ~
也可以,变成倒数第101个。
git reset --hard [commit id]
回退到某一提交过的版本,如果已经 push
,则回退的意义不大了。版本号没必要写全,前几位就可以了,Git
会自动去找。当然也不能只写前一两位,因为Git
可能会找到多个版本号,就无法确定是哪一个了。
git reflog
显示当前分支的最近几次提交。它纪录每一次命令,可用于查找某一提交版本的 commit id
。
撤销修改
git checkout -- [file]
丢弃工作区的修改,包括修改后还没有放到暂存区和添加到暂存区后又作了修改两种情况。总之,让该文件回到最近一次git commit
或git add
之后的状态。注意:没有 – ,就变成了切换分支的命令了。
git reset
既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。
git reset HEAD [file]
把暂存区的修改撤销(unstage
),回退到工作区。注意:在 Git
中任何已提交的东西几乎总是可以恢复的。甚至那些被删除的分支中的提交或使用 –amend
选项覆盖的提交也可以恢复。然而,任何未提交的东西丢失后很可能再也找不到了。
删除文件
git rm [file1] [file2] ...
删除工作区文件,并且将这次删除放入暂存区。
git rm -f 文件
强制删除版本库中有修改的文件。
git rm --cached 文件
把文件从版本库中删除,但让文件保留在工作区且不被 Git 继续追踪(track
),通常适用于在 rm
之后把文件添加到 .gitignore
中的情况。
远程仓库操作
git remote
查看已经配置的远程仓库服务器,效果同 git remote show
。
git remote -v
显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。
git remote show [remote-name]
参数 remote-name 通常都是缩写名 origin,可以得到远程分支更为详细的信息以及 pull 和 push 相关提示信息。
git remote add [shortname] [url]
添加并关联一个远程库。其中,shortname
一般是 origin
,也可以是其他字符串,用来代替整个 url
。
git push
推送本地修改到 origin。
git push -u origin master
关联后,由于远程库是空的,使用该命令第一次推送 master
分支的所有内容,Git不但会把本地的master
分支内容推送到远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,后续再推送的时候就可以省略后面三个参数了,其中参数 -u
代表上游(upstream
)的意思。
git push [remote] [branch]
上传本地指定分支到远程仓库。
git pull
抓取远程库最新提交,拉取并合并。
分支管理
git branch
列出本地当前所有分支,方便查看。当前分支前面会标有一个 *
号。
git branch [branch]
新建一个分支,但依然停留在当前分支。
git branch -d [branch]
普通删除分支(相对强制删除而言)。一般情况下,先合并完分支,然后再删除,否则会删除失败,除非使用 -D
参数强制删除。
git branch -D [branch]
强行删除分支,尤其适用分支内容有了新的修改但还没有被合并的情况。
git branch --set-upstream [branch] origin/[branch]
建立本地分支和远程分支的关联。
git checkout [branch]
切换到指定分支,并更新工作区。
git checkout -b [branch]
创建并切换到新的分支。
git merge [branch]
合并指定分支到当前分支。
git merge --no-ff -m "message" [branch]
参数 --no-ff
表示禁用 Fast forward
快进模式,用普通模式合并,这样合并后的历史有分支,能看出来曾经做过合并,而 Fast forwad
合并就看不出来曾经做过合并。
git log --graph --pretty=oneline --abbrev-commit
查看分支的合并情况,包括分支合并图、一行显示、提交校验码缩略显示。
git stash
把当前分支的工作现场储存起来,等以后恢复现场后继续工作。一般适用于还没有 commit
的分支代码。
git stash list
查看储存的工作现场纪录列表。
git stash apply + git stash drop
用 git stash apply
命令恢复最近 stash
过的工作现场,但是恢复后,stash
内容并不删除,用 git stash drop
命令来删除。apply
和 drop
后面都可以加上某一指定的 stash_id
。
git stash pop
相当于git stash apply
+ git stash drop
,恢复回到工作现场的同时把 stash
内容也删除了。
git rebase 目标分支(通常是 master)
在本地 master 上进行变基操作。
标签管理
git tag
查看所有标签。这里标签不是按照时间列出,而是按照字母排序。
git tag [tag name] [commit id]
在需要打标签的分支上创建一个轻量标签(lightweight
),默认为 HEAD
,也可以指定一个 commit id
。
git tag -a [tag name] -m "message" [commit id]
创建附注标签(annotated
),用 -a
指定标签名,-m
指定说明文字,也可以指定一个 commit id
。
git tag -d [tag name]
删除一个本地标签。因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
git show [tag name]
查看标签信息。
git push origin [tag name]
推送本地某个标签到远程,默认情况下,git push
命令并不会推送标签到远程,必须显式推送。
git push origin --tags
参数 –tags
表示一次性推送全部未推送到远程的本地标签,当其他人从仓库中克隆或拉取,他们也能得到那些标签。
git push origin :refs/tags/[tag name]
删除一个远程标签。要先从本地删除,再用该命令从远程删除。
其他
git check-ignore -v [file]
可能是 .gitignore
写得有问题时,使用该命令找出到底哪个命令写错了。
git config --global alias.st status
使用 git st
代替 git status
命令。