简单总结下使用 git 进行版本控制的时候一些常用命令,以及一些常用语

创建SSH秘钥

ssh-keygen -t rsa -C "lzan13@sina.com"

这个命令会在当前用户目录下生成一个.ssh目录,然后生成两个文件.id_rsa私钥和.id_rsa.pub公钥

本地操作相关

主要是在本地仓库操作时使用的一些命令

git status

git status

查看当前仓库状态:是否有文件修改,需要添加等

git add

git add <file>
git add .

将文件添加到暂存区,后边跟着文件名,可以使用.表示添加全部文件

git commit

git commit -m "first commit"

提交暂存区的所有代码到版本库,参数就是本次提交的说明信息

git log

git log // 查看提交日志
git log --pretty=oneline // 查询信息都在一行显示
git log --graph // 查看分之合并图

提交日志相关,列出从最近到之前的提交日志,列出信息包含有SHA1计算得到的commit_id

git reset

git reset --hard HEAD^
git reset --hard <commit_id>

这个命令的作用是将代码回退到之前提交的版本,在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,如果是多个可以写成HEAD~ N,N 代表是第几个,也可以和git log的结果关联起来使用

git relog

git relog

Git 工具操作命令历史日志,和git log稍有不同,git relog会记录所有 git 操作

git diff

git diff
git diff <file>
git diff [<commit_id>] -- <file> // 表示要查看当前文件与上个版本库中的区别

查看文件差异,不带有参数时会列出本次修改所有文件,带上参数时需要制定文件全路径

git checkout

git checkout -- <file>

撤销对文件的本次修改,回到之前的状态,准确点儿是回到上次调用git add或者git commit状态

git rm

git rm <file>

从版本库删除一个文件,与本地的删除一个文件不同,这里是直接将版本库里的文件删除了,如果之前有将文件提交到版本库,可以使用git checkout -- filename恢复;

git branch

git branch // 查看分支 -v 本地全部分支,-a 包括远程全部分支
git checkout -b <branch> // 创建并切换分支,等同于下边两个命令
git branch <branch> // 创建分支
git checkout <branch> // 切换分支
git branch -d <branch> // 删除本地分支

分支相关操作命令

git merge

git merge <branch>

合并指定分支到当前所在分支,在使用merge命令时有可能会出现代码修改冲突的情况,特别是在多人协作的情况下,冲突用<<<<<<<>>>>>>>包裹,中间用=======分割,=======以上是当前分支内容,以下是合并到当前分支的其他分支内容;

远程操作相关

主要是和操作远程仓库相关的一些命令

git remote

git remote add <name> <url>
git remote remove <name>
git remote rename <old> <new>

管理当前仓库的远程地址,分别是:添加远程仓库地址、删除远程仓库、重命名远程仓库

git push

git push -u <remote> <branch>
git push <remote> <branch>
git push <remote> <branch>:<branch> // 将本地分支上传到远程的一个新分支
git push <remote :<branch> // 将本地空分支推送到远端,即删除远程分支

此命令是将本地仓库推送到远程仓库,第一次推送到远程分支需要加上-u参数,

git pull

git pull origin <branch> // 同步远端指定分支并合并到当前分支

git fetch

git pull origin <branch> // 同步远端指定分支并合并到当前分支

这个命令也是拉取远端分支代码,但是和pull不同的是这个命令指示拉取分支代码,并不会合并,需要手动调用git merge进行合并代码

git clone

git clone <url> [<dir>]
git clone -b <branch> <url> [<dir>]
git checkout -b <branch> <remote>/<branch> // 根据远程仓库的分支创建并切换到新分支

克隆远程仓库到本地,可以使用-b参数指定克隆的分支,以及指定克隆后的文件夹名称,不设置就是默认远程仓库名字;

关于撤销

修正最后一个 commit 消息

git commit --amend
# or
git commit --amend -m "Fixes bug #42"

场景: 你在最后一条 commit 消息里有个笔误,已经执行了 git commit -m "Fxies bug #42",但在 git push 之前你意识到消息应该是 “Fixes bug #42″。
原理: git commit --amend 会用一个新的 commit 更新并替换最近的 commit ,这个新的 commit 会把任何修改内容和上一个 commit 的内容结合起来。如果当前没有提出任何修改,这个操作就只会把上次的 commit 消息重写一遍。

撤销“本地的”修改

git checkout -- <bad filename>

场景: 一只猫从键盘上走过,无意中保存了修改,然后破坏了编辑器。不过,你还没有 commit 这些修改。你想要恢复被修改文件里的所有内容 — 就像上次 commit 的时候一模一样。
原理: git checkout 会把工作目录里的文件修改到 Git 之前记录的某个状态。你可以提供一个你想返回的分支名或特定 SHA ,或者在缺省情况下,Git 会认为你希望 checkout 的是 HEAD,当前 checkout 分支的最后一次 commit。
记住:你用这种方法“撤销”的任何修改真的会完全消失。因为它们从来没有被提交过,所以之后 Git 也无法帮助我们恢复它们。你要确保自己了解你在这个操作里扔掉的东西是什么!(也许可以先利用 git diff 确认一下)

重置“本地的”修改(版本回退)

git reset <last good SHA> 或 git reset --hard <last good SHA>

场景: 你在本地commit了一些东西(还没有 push),但是所有这些东西都很糟糕,你希望撤销前面的三次提交 — 就像它们从来没有发生过一样。
原理: git reset 会把你的代码库历史返回到指定的 SHA 状态。 这样就像是这些提交从来没有发生过。缺省情况下, git reset 会保留工作目录。这样,提交是没有了,但是修改内容还在磁盘上。这是一种安全的选择,但通常我们会希望一步就“撤销”提交以及修改内容 — 这就是 --hard 选项的功能。

在撤销“本地修改”之后再恢复

git reflog 和 git reset 或 git checkout

场景: 你提交了几个 commit,然后用 git reset --hard 撤销了这些修改(见上一段),接着你又意识到:你希望还原这些修改!
原理: git reflog 对于恢复项目历史是一个超棒的资源。你可以恢复几乎 任何东西 — 任何你 commit 过的东西 — 只要通过 reflog。
你可能已经熟悉了 git log 命令,它会显示 commit 的列表。 git reflog 也是类似的,不过它显示的是一个 HEAD 发生改变的时间列表.
一些注意事项:
它涉及的只是 HEAD 的改变。在你切换分支、用 git commit 进行提交、以及用 git reset 撤销 commit 时,HEAD 会改变,但当你用 git checkout -- 撤销时(正如我们在前面讲到的情况),HEAD 并不会改变 — 如前所述,这些修改从来没有被提交过,因此 reflog 也无法帮助我们恢复它们。
git reflog 不会永远保持。Git 会定期清理那些 “用不到的” 对象。不要指望几个月前的提交还一直躺在那里。
你的 reflog 就是你的,只是你的。你不能用 git reflog 来恢复另一个开发者没有 push 过的 commit。

撤销一个“已公开”的改变

git revert <SHA>

场景: 你已经执行了 git push, 把你的修改发送到了 GitHub,现在你意识到这些 commit 的其中一个是有问题的,你需要撤销那一个 commit.
原理: git revert 会产生一个新的 commit,它和指定 SHA 对应的 commit 是相反的(或者说是反转的)。如果原先的 commit 是“物质”,新的 commit 就是“反物质” — 任何从原先的 commit 里删除的内容会在新的 commit 里被加回去,任何在原先的 commit 里加入的内容会在新的 commit 里被删除。
这是 Git 最安全、最基本的撤销场景,因为它并不会改变历史 — 所以你现在可以 git push 新的“反转” commit 来抵消你错误提交的 commit。

参考

参考网站 廖雪峰 Git 教程