Git常用命令

git add

1. git init 
<!--初始化一个 Git仓库(repository),即把当前所在目录变成 Git 可以管理的仓库-->
2. git add 文件
<!--把文件添加到 暂存区(stage),可被 track 追踪纪录下来。可多次使用来添加多个文件。-->
3. git add -A
<!--暂存所有的文件,包括新增加的、修改的和删除的文件。-->
4.git add .
<!--暂存新增加的和修改的文件,不包括已删除的文件。即当前目录下所有文件。-->

git commit

1.git commit -m "本次提交说明"
<!--一次性把暂存区所有文件修改提交到仓库的当前分支-->
2. git commit -am "本次提交说明"
<!--使用该命令,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤,参数 -am 也可写成 -a -m。“在 oh-my-zsh 下,直接用 gcam “message” 就搞定了”,-->
3. git commit --amend
<!--重新提交,最终只会有一个提交,第二次提交将代替第一次提交的结果。尤其适用于提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了的情况。-->

DIFF AND SHOW

1. git status
<!--显示当前仓库的最新状态。提交之后,工作区就是“干净的”,即没有新的修改;有未提交文件时,最上面显示的是在 staging area,即将被 commit 的文件;中间显示没有 stage 的修改了的文件,最下面是新的还没有被 Git track 的文件。“在 oh-my-zsh 下,输入 gst 就出来了,谁用谁知道,装逼利器,效率杠杠的-->
2. git diff
//查看工作区中的修改
3. git diff --staged 或 git diff --cached
<!--查看暂存区中的修改-->
4. git diff <commit id1> <commit id2>
//比较两次 commit 之间的差异
5. git diff <branch1> <branch2>
<!-- 两个 branch 之间比较 -->
6. git diff 文件
//查看指定文件具体修改了哪些内容
7. git show
//查看最后一个 commit 的修改
8. git blame 文件
//查看谁什么时间改了哪些文件

LOG

1. git log
<!--显示从最近到最远的提交日志,包括每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明等基本信息。-->
2. git log -p -2
<!--除显示基本信息之外,还显示每次提交的内容差异,-2 意思是仅显示最近两次提交。特别适用于进行代码审查,或者快速浏览某个搭档提交的 commit 所带来的变化-->
3. git log --graph
<!--查看分支合并图-->
4. git log --pretty=oneline
<!-- -->
<!-- 简化日志信息,将每个提交放在一行显示,查看的提交数很大时非常有用,也可带有 –graph 参数,效果同 git config format.pretty oneline -->
5. git reflog
<!-- 纪录每一次命令,可用于查找某一提交版本的 commit id -->

RESET AND REVERT

1. git reset HEAD 文件
<!--把暂存区的修改撤销(unstage),回退到工作区。注意:在 Git 中任何已提交的东西几乎总是可以恢复的。甚至那些被删除的分支中的提交或使用 –amend 选项覆盖的提交也可以恢复。然而,任何未提交的东西丢失后很可能再也找不到了-->
2. git reset --hard
<!--重置所有文件到未修改的状态-->
3. git reset <commit SHA>
<!--重置到某个 commit-->
4. git reset --hard HEAD^
<!--回退到上一个版本。同理,回退到上上个版本为:HEAD^ ^, 回退到上100个版本为:HEAD-100,貌似波浪号 ~ 也可以,变成倒数第101个。-->
5. git reset --hard <commit id>
<!--回退到某一提交过的版本,如果已经 push,则回退的意义不大了-->
6. git revert <commit id>
<!--还原某个 commit。还原(revert)的实质是产生一个新的 commit,内容和要还原的 commit 完全相反。比如,A commit 在 main.c 中增加了三行,revert A 产生的 commit 就会删除这三行。如果我们非常确定之前的某个 commit 产生了 bug,最好的办法就是 revert 它。git revert 后 git 会提示写一些 commit message,此处最好简单描述为什么要还原;而重置(reset)会修改历史,常用于还没有 push 的本地 commits-->
7. git revert HEAD
<!--还原到上次 commit-->

REMOVE

1. git rm 文件
<!--把文件从版本库中删除,不会再追踪到-->

REMOTE

1. git remote
<!--查看已经配置的远程仓库服务器-->

CLONE

git clone git@github.com:username/<repo name>.git
<!--从远程库(origin)克隆一份到本地,仓库名同远程仓库名-->

BRANCH AND MERGE

1. git branch
<!--列出本地当前所有分支,方便查看。当前分支前面会标有一个 * 号-->
2. git branch -r
<!--查看远程分支列表-->
3. git branch -a
显示所有分支,包括本地和远程
4. git branch -v
// 查看每一次分支的最后一次提交
5. git branch --merged
<!--查看所有已经被 merge 的 branch-->
6. git branch --no-merged
<!--查看所有还没被 merge 的 branch-->
7. git branch --merged | xargs git branch -d
<!--删除所有已经被 merge 的 branch-->
8. git checkout -b 分支
<!--创建并切换到新的分支,相当于下面两条命令:git branch 分支 + git checkout 分支-->
9. git cherry-pick <commit id>
<!--假如我们在某个 branch 做了一大堆 commit,而当前 branch 想应用其中的一个,可以使用该命令-->
10. git merge 分支
<!--合并指定分支到当前所在的分支-->
11. git merge --no-ff -m "提交说明信息" 分支
<!--参数 –no-ff 表示禁用 Fast forward 快进模式,用普通模式合并,这样合并后的历史有分支,能看出来曾经做过合并,而 fast forwad 合并就看不出来曾经做过合并-->
12. git branch -d 分支
<!--普通删除分支(相对强制删除而言)。一般情况下,先合并完分支,然后再删除,否则会删除失败,除非使用 -D 参数强制删除。注意:因为创建、合并和删除分支非常快,所以 Git 鼓励使用分支完成某个任务,合并后再删除分支,这个直接在 master 分支上工作效果是一样的,但过程更安全-->
13. git branch -D 分支
<!--强行删除分支,尤其适用分支内容有了新的修改但还没有被合并的情况-->
14. git branch --set-upstream 分支 origin/分支
<!--建立本地分支和远程分支的关联-->

STASH

1. git stash
<!--把当前分支的工作现场储存起来,等以后恢复现场后继续工作。一般适用于还没有 commit 的分支代码-->
2. git stash list
<!--查看储存的工作现场纪录列表-->
3. git stash pop
<!--恢复回到工作现场的同时把 stash 内容也删除了-->
4. git stash clear
<!--清空所有暂存区的 stash 纪录。drop 是只删除一条,当然后面可以跟 stash_id 参数来删除指定的某条纪录,不跟参数就是删除最近的。-->

PULL AND PUSH

1. git push origin 分支
<!--把该分支上的所有本地提交推送到远程库对应的远程分支上-->
2. git pull
<!--抓取远程库最新提交,拉取并合并-->
3. git fetch
<!--没有 merge 的 pull-->
4. git push origin --delete 远程分支 或 git push origin:远程分支
<!--删除一个远程分支。基本上这个命令做的只是从服务器上移除这个指针。 Git 服务器通常会保留数据一段时间直到垃圾回收运行,所以如果不小心删除掉了,通常是很容易恢复的-->
5. git push origin -delete 分支
<!--在本地和远程同步删除分支-->
6. git push -u origin master
<!--关联后,使用该命令第一次推送 master 分支的所有内容,后续再推送的时候就可以省略后面三个参数了,其中参数 u 代表上游(upstream)的意思。-->
7. git push origin <tag-name>
<!--推送本地某个标签到远程,默认情况下,git push 命令并不会推送标签到远程,必须显示推送。-->
8. git push origin --tags
<!--参数 –tags 表示一次性推送全部未推送到远程的本地标签,当其他人从仓库中克隆或拉取,他们也能得到那些标签。-->
9. git push origin :refs/tags/<tag-name>
<!--删除一个远程标签,先从本地删除,再用该命令从远程删除。-->
10. git pull --rebase
<!--修整提交线图,使其形成一条直线。-->

TAG

1. git tag
<!--查看所有标签-->
2. git show <tag-name>
<!--查看标签信息-->
3. git checkout <tag-name>
<!--切换 tag。-->
4. git tag <tag name> <commit id>
<!--在需要打标签的分支上创建一个轻量标签(lightweight),默认为 HEAD,也可以指定一个 commit id。-->
5. git tag -a <tag-name> -m "标签说明文字" <commit id>
<!--创建附注标签(annotated),用 -a 指定标签名,-m 指定说明文字,也可以指定一个 commit id。-->
6. git tag -a <tag-name> 提交的校验和或部分校验和
<!--后期打标签,即对过去的提交打标签。校验和(checksum):长度为 40位的16进制数的 SHA-1 值字符串。然而,只要没有冲突,通常可以用一个比较短的前缀来表示一个 commit。-->
7. git tag -d <tag-name>
<!--删除一个本地标签。因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。-->

git checkout

1. git checkout <tag-name>
<!--切换 tag。-->
2. git checkout -b 分支 origin/分支
<!--如果远程有某一个分支而本地没有,用该命令把远程的这个分支迁到本地-->
3. git checkout -b 分支
<!--创建并切换到新的分支,相当于下面两条命令:git branch 分支 + git checkout 分支-->
4. git checkout -- 文件
<!--丢弃工作区的修改,包括修改后还没有放到暂存区和添加到暂存区后又作了修改两种情况。总之,让该文件回到最近一次 git commit 或 git add 之后的状态。注意:没有 – ,就变成了切换分支的命令了-->
4. git checkout .
<!--放弃本地所有修改的-->
5. git checkout 分支
<!--切换分支-->
6. 解决.gitignore失效
git rm -r --cached .
git add .
git commit -m "update .gitignore"