1. 基本命令
- git diff
不加参数直接输入 git diff : 尚未暂存的文件更新了哪些部分
git diff --staged : 已暂存文件与最后一次提交的文件差异
git diff --cached : --staged 和 --cached 是同义词
git diff --check : 它将会找到可能的空白错误并将它们为你列出来
- git commit
git commit -m "message": 提交代码
请记住,提交时记录的是放在暂存区域的快照。
任何还未暂存文件的仍然保持已修改状态,可以在下次提交时纳入版本管理。
每一次运行提交操作,都是对你项目作一次快照,以后可以回到这个状态,或者进行比较。
git commit -m -a "message": 尽管使用暂存区域的方式可以精心准备要提交的细节,但有时候这么做略显繁琐。
Git 提供了一个跳过使用暂存区域的方式, 只要在提交的时候,给 git commit 加上 -a 选项,
Git 就会自动把所有已经跟踪过的文件暂存起来一并提交。
git commit -amend: 修改提交
- git rm
git rm file: 从已跟踪文件清单中移除(确切地说,是从暂存区域移除), 并连带从工作目录中删除指定的文件
git rm -f file: 如果要删除之前修改过或已经放到暂存区的文件,则必须使用强制删除选项 -f(译注:即 force 的首字母)
git rm --cached file: 让文件保留在磁盘,但是并不想让 Git 继续跟踪。
- git mv
git mv README.md README 相当于
mv README.md README
git rm README.md
git add README
不像其它的 VCS 系统,Git 并不显式跟踪文件移动操作。 如果在 Git 中重命名了某个文件,仓库中存储的元数据并不会体现出这是一次改名操作。 不过 Git 非常聪明,它会推断出究竟发生了什么。
- git log
在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的工具是 git log 命令
git log --patch, 它会显示每次提交所引入的差异(按 补丁 的格式输出),
你也可以限制显示的日志条目数量,例如使用 -2 选项来只显示最近的两次提交: git log -p -2
git log --stat, 每次提交的简略统计信息, 可以使用 --stat 选项
git log --relative-date, 使用较短的相对时间而不是完整格式显示日期(比如“2 weeks ago”)
git log --name-status, 显示新增、修改、删除的文件清单
git log --oneline, --pretty=oneline --abbrev-commit 合用的简写。
git log --oneline 查看简要描述
git log --author author_name, 显示指定作者的提交
git log --grep, 搜索提交说明中的关键字
git log -S function_name, 只会显示那些添加或删除了该字符串的提交,
假设你想找出添加或删除了对某一个特定函数的引用的提交,可以调用
以上的够用了,更多的https://git-scm.com/book/zh/v2/Git-基础-查看提交历史
git reflog
看到版本号下对应做了什么事(以简短的方式查看日志)
d735064 HEAD@{0}: commit: add download function
e2eadb1 HEAD@{1}: commit: adapter image module
dd6b511 HEAD@{2}: commit: fix bug
d1dabea HEAD@{3}: commit: add download_videos module
1cb617f HEAD@{4}: commit: update
5e4d8c8 HEAD@{5}: commit: add capture image module
c98f434 HEAD@{6}: commit: update tool
70e5bd7 HEAD@{7}: clone: from http://github.com/wohu/tools.git
- git reset
git reset HEAD [< file >], 取消暂存的文件
- git stash
希望回到以前的版本,但又不想把现有的代码提交。
git stash 创建临时工作去
git stash list 查看保存的工作区
git stash apply stash@{1} 应用哪个工作区
git stash pop 应用上一个工作区并且删除
git stash drop stash@{0} 删除指定的工作区
git stash clear 删除所有的工作区
- git checkout
请务必记得 git checkout – < file > 是一个危险的命令。 你对那个文件在本地的任何修改都会消失——Git 会用最近提交的版本覆盖掉它。 除非你确实清楚不想要对那个文件的本地修改了,否则请不要使用这个命令。
git checkout -- < file >
git checkout <branch_name> 用于切换分支
git checkout -b dev origin/dev 如果本地没有 dev 分支,想要基于服务器端 dev 分支创建一个,
但又不想影响到本地的当前分支。可以使用此命令进行本地 dev 分支的创建。
- git remote
运行 git remote 命令, 它会列出你指定的每一个远程服务器的简写。
git remote -v
, 会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL
wohu@ubuntu-dev:~/git_demo/test_demo$ git remote -v
origin http://192.168.0.17:3000/wohu/test_demo.git (fetch)
origin http://192.168.0.17:3000/wohu/test_demo.git (push)
wohu@ubuntu-dev:~/git_demo/test_demo$
git remote add < shortname > < url >, 添加一个新的远程 Git 仓库,同时指定一个方便使用的简写
git remote show < remote >, 查看某一个远程仓库的更多信息
git remote rename, 修改一个远程仓库的简写名
git remote rename pb paul,将 pb 重命名为 paul
git remote remove, 移除一个远程仓库,你已经从服务器上搬走了或不再想使用某一个特定的镜像了又或者
某一个贡献者不再贡献了——可以使用 git remote remove 或 git remote rm
- git fetch
git fetch < remote >, 这个命令会访问远程仓库,从中拉取所有你还没有的数据, 执行完成后,
你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。
所以,git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。
必须注意 git fetch 命令只会将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作。
当准备好时你必须手动将其合并入你的工作。
- git push
要将本地内容提交到远程仓库,需要使用 git push 命令。 提供远程仓库简称,然后提供要推送提交的分支名称:
git push <远程仓库简称> <要推送的分支>
注:我们也加入 -u
选项,git push -u origin master
会使得下次推送提交时只运行 git push
命令即可。
git push origin master, 只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。
当你和其他人在同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。
你必须先抓取他们的工作并将其合并进你的工作后才能推送。
git push origin dev 将本地当前分支推到远程 dev 分支。
git push origin --delete <branchname>, 删除远程分支
git push origin :dev 删除服务器端分支 dev
- git tag
git tag -a <tagName> 添加标签,-a 代表添加说明,不加也可以
git tag -a <tagName> -m <comment> 添加标签,-m 是给 -a 添加的说明,不加 -m 则 git 会给出弹框,让你填写,
添加 -m 则不会弹出
git tag -d <tagName> 删除标签
git tag 查看标签
git tag --lits, 列出已有的标签
git tag -l "v1.8.5", 你也可以按照特定的模式查找标签。 例如,Git 自身的源代码仓库包含标签的数量超过 500 个。
如果只对 1.8.5 系列感兴趣,可以运行 git tag -l "v1.8.5"
git tag -a v1.4 -m "my version 1.4", 创建附注标签(annotated)
git show v1.4, 标签信息和与之对应的提交信息
git tag v1.4-lw, 创建轻量标签(lightweight)
轻量标签本质上是将提交校验和存储到一个文件中——没有保存任何其他信息
创建轻量标签,不需要使用 -a、-s 或 -m 选项,只需要提供标签名字 后期打标签
git tag -a v1.2 9fceb02, 要在那个提交上打标签,你需要在命令的末尾指定提交的校验和(或部分校验和)
共享标签
git push origin < tagname >, 默认情况下,git push 命令并不会传送标签到远程仓库服务器上。
在创建完标签后你必须显式地推送标签到共享服务器上
git push origin --tags, 如果想要一次性推送很多标签,也可以使用带有 --tags 选项的 git push 命令。
这将会把所有不在远程仓库服务器上的标签全部传送到那里使用 git push < remote > --tags
推送标签并不会区分轻量标签和附注标签, 没有简单的选项能够让你只选择推送一种标签。
git tag -d < tagname >, 删除掉你本地仓库上的标签
注意上述命令并不会从任何远程仓库中移除这个标签,你必须用 git push < remote > :refs/tags/< tagname >
来更新你的远程仓库, 上面这种操作的含义是,将冒号前面的空值推送到远程标签名,从而高效地删除它。
第二种更直观的删除远程标签的方式是: git push origin --delete < tagname >
- git branch
git branch 查看本地存在分支
git branch -r 查看远程服务器上有多少个分支
git branch -v, 查看每一个分支的最后一次提交
git branch --merged, 查看哪些分支已经合并到当前分支
git branch --no-merged, 查看哪些分支尚未合并到当前分支
git branch --no-merged master,查看哪些分支尚未合并到 master 分支
git branch -a 查看所有本地关联到的分支(远端分支也能打印出来,但是关联如果没有建立,
那么是不会显示的,此时我们可以使用 git fetch 拉下来所有分支。
git branch < name >, 创建分支,为你创建了一个可以移动的新的指针
git branch -d dev 删除本地分支 dev(注意:删除本地分支时,当前所处分支不能是要删除的该本地分支)。
git branch -D dev 强制删除本地分支 dev(如果 dev 分支当前修改的内容没有暂存,那么只有强制删除有效)。
git branch -u origin/serverfix, 设置已有的本地分支跟踪一个刚刚拉取下来的远程分支,
或者想要修改正在跟踪的上游分支, 你可以在任意时间使用 -u 或 --set-upstream-to 选项运行 git branch 来显式地设置
git branch -vv, 如果想要查看设置的所有跟踪分支, 这会将所有的本地分支列出来并且包含更多的信息,
如每一个分支正在跟踪哪个远程分支与本地分支是否是领先、落后或是都有。
需要重点注意的一点是这些数字的值来自于你从每个服务器上最后一次抓取的数据。 这个命令并没有连接服务器,
它只会告诉你关于本地缓存的服务器数据。 如果想要统计最新的领先与落后数字,需要在运行此命令前抓取所有的远程仓库。
可以像这样做:git fetch --all; git branch -vv
git branch -f master HEAD~3
- git checkout
git checkout master, 这条命令做了两件事。
一是使 HEAD 指回 master 分支
二是将工作目录恢复成 master 分支所指向的快照内容
git checkout -b < newbranchname >, 创建一个新分支后立即切换过去
git checkout -b < branch > < remote >/< branch >, 创建一个新分支后立即切换过去, 并且跟踪远程仓库的分支
- git merge
git merge <branchname>, 在当前分支合并另一个分支的修改
当你试图合并两个分支时, 如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候,
只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧——这就叫做 “快进(fast-forward)”
git merge origin/dev 将服务器端 dev 分支合并到本地当前分支下。
git merge dev 将本地 dev 分支合并到本地当前分支下,这一步之前先 `git checkout branch_name` 切换到要合并的分支上。
- git add
git add 将工作文件修改提交到本地暂存区。
git add . 将所有修改过的工作文件提交暂存区(常用)。
- git rebase 变基
详情: https://git-scm.com/book/zh/v2/Git-分支-变基
- 如何避免每次输入密码
git config --global credential.helper cache, 如果你正在使用 HTTPS URL 来推送,Git 服务器会询问用户名与密码。
默认情况下它会在终端中提示服务器是否允许你进行推送。
如果不想在每一次推送时都输入用户名与密码,你可以设置一个 “credential cache”。
最简单的方式就是将其保存在内存中几分钟,可以简单地运行 git config --global credential.helper cache 来设置它。
- git pull
git pull origin dev 拉取服务器端 dev 分支的内容并合并到本地 dev 分支
(一般来说,多人共用一个分支时,如果你有需要提交到服务器的内容,则要先用此命令更新本地分支的内容,
然后再将新的内容提交到服务器)。
git fetch origin dev 拉取服务器端 dev 分支的内容,但不合并。
此操作一般是不确定远端代码是否存在问题,为保险起见,可先拉取到本地查看,确认无误后,和合并此代码到本地的对应分支下。
git fetch 命令会将远程仓库的更改拉取到本地,作为 master 的一个分支,分支的地点是本地与远程同步的 commit。将 origin/master 分支合并到 master 分支,先完成然后再将本地仓库内容上传到远程仓库。
此时我们可以将本地仓库 master 分支 push 到远程仓库,远程仓库会包含本地的合并:
执行 git pull 更新你的本地仓库至最新改动。
若本地与远程都有更改,pull 失败,就在你的工作目录中获取(fetch)并合并(merge) 远端的改动。
$ git fetch origin master
$ git checkout master
$ git merge origin/master
- git status
git status 查看当前分支的状态,一般合并分支代码后,用于检查是否有冲突
2. 实践
首先,我们创建 dev 分支,然后切换到 dev 分支:
$ git checkout -b dev
Switched to a new branch 'dev'
git checkout
命令加上 -b
参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
然后,用 git branch
命令查看当前分支:
$ git branch
* dev
master
git branch
命令会列出所有分支,当前分支前面会标一个 *
号。然后,我们就可以在 dev 分支上正常提交,比如对 readme.txt 做个修改,加上一行:
echo "Creating a new branch is quick." >> readme.txt
然后提交:
$ git add readme.txt
$ git commit -m "branch test"
[dev b17d20e] branch test
1 file changed, 1 insertion(+)
现在,dev 分支的工作完成,我们就可以切换回 master 分支:
$ git checkout master
Switched to branch 'master'
切换回 master 分支后,再查看一个 readme.txt 文件,刚才添加的内容不见了!因为那个提交是在 dev 分支上,而 master 分支此刻的提交点并没有变:
现在,我们把 dev 分支的工作成果合并到 master 分支上:
$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
git merge
命令用于合并指定分支到当前分支。合并后,再查看 readme.txt 的内容,就可以看到,和 dev 分支的最新提交是完全一样的。
注意到上面的 Fast-forward 信息,Git 告诉我们,这次合并是“快进模式”,也就是直接把 master 指向 dev 的当前提交,所以合并速度非常快。当然,也不是每次合并都能 Fast-forward,我们后面会讲其他方式的合并。
合并完成后,就可以放心地删除 dev 分支了:
$ git branch -d dev
Deleted branch dev (was b17d20e).
删除后,查看 branch,就只剩下 master 分支了:
$ git branch
* master
因为创建、合并和删除分支非常快,所以 Git 鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在 master 分支上工作效果是一样的,但过程更安全。
参考:
https://gitbook.cn/books/5ebca21b9b907c12334b6287/index.html