常用 Git 命令
Git 基础命令与运用
从根本上来讲,Git 是一个内容寻址文件系统,并在此之上提供了一个版本控制系统的用户界面。这意味着 Git 的核心部分是一个简单的键值对数据库。
基础命令
配置 Git
1
2
3
4
5
6
7
8
9
10
11
12# 配置全局用户
git config --global user.name "Your name"
git config --global user.email "Your email"
# 配置命令的别名
git config --global alias.co checkout
git config --global alias.ss status
git config --global alias.cm commit
git config --global alias.br branch
git config --global alias.rg reflog
# 删除全局配置
git config --global --unset alias.xxx
git config --global --unset user.xxx
查看信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25# 查看 git 配置
git config --list
# 查看用户配置
git ~/.gitconfig
# 查看当前项目的 git 配置
git .git/config
# 查看暂存区的文件
git ls-files
# 查看本地 git 命令历史
git reflog
# 查看当前 HEAD 指向
cat .git/HEAD
# git 中 D 向下翻一行 F 向下翻页 B 向上翻页
# git 查看提交历史
git log --oneline
# 查找和关键字有关的 log
git log --grep="关键字"
# 图形化显示 log
git log --graph
# 查找指定作者的 log
git log --author "username"
# 显示最近 num 次提交
git log -num
# 显示每次更新的文件修改统计信息
git log --stat
初始化
git仓库1
git init
在本地创建一个新的仓库
Clone
1
git clone /path/to/repository
创建一个本地仓库的备份
1
git clone username@host:/path/to/repository
创建一个服务上仓库的备份
1
git clone [url] <custom_name>
为克隆的仓库指定别名
Add
1
2
3
4
5
6
7
8
9
10
11
12
13
14# 添加一个或多个文件到索引
git add [file1] [file2] ...
# 将当前目录的所有文件变更提交到暂存区,不包括被删除的文件
git add .
# 将工作区已经追踪的文件变更提交到暂存区,不会提交新文件(即 untracked file)
git add -u
# 将工作区的所有文件变更提交到暂存区
git add -A
# 删除工作区/暂存区的文件
git rm [file1] [file2] ...
# 停止追踪指定文件,但此文件会保留在工作区
git rm --cached [file]
# 修改工作区/暂存区的文件的名称
git mv [file_original] [file_renames]Commit
1
2
3
4
5
6
7
8
9
10
11# 提交变更到本地仓库
git commit -m "Commit message"
# add 和 commit 的合并的便捷写法
git commit -am "Commit message"
# 跳过验证继续提交
git commit --no-verify
git commit -n
# 修改上一次提交的信息
git commit --amend
# 修复提交并修改提交信息
git commit --amend -m "commit message"Push/Pull
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# 将本地仓库的文件推送到远程分支
# 如果远程仓库没有这个分支,会创建一个同名的远程分支
# 如果两者同名,则可省略远程分支名称
git push <远程主机名> <本地分支名>:<远程分支名>
# 如果省略本地分支名称,则表示删除指定的远程分支
git push origin :<远程分支名>
# 相当于
git push origin --delete <远程分支名>
# 将当前分支与远程分支进行关联
git push -u origin <远程分支名>
# 将本地的所有分支推送到远程仓库
git push --all origin
# 从关联的远程分支拉取更改到当前分支
git pull
# 拉取其它分支并合并到当前分支
git pull origin <远程分支名>Diff
1
2
3
4# 比较的是工作目录文件与暂存区文件的区别
git diff
# 比较的是暂存区的文件与仓库分支里的文件的区别
git diff --cachedStatus
1
git status
列出你已经更改过但是还没有添加或提交的文件
Remote
1
2
3
4
5
6
7
8# 查看所有远程主机
git remote
# 查看关联的远程仓库的详细信息
git remote -v
# 移除与远程仓库的关联
git remote rm <仓库名称>
# 设置关联的远程仓库
git remote set-url origin <远程仓库地址>Branches
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24# 查看本地分支
git branch | git branch -l
# 查看远程分支
git branch -r
# 查看所有分支
git branch -a
# 查看所有分支和最新的提交
git branch -av
# 新建分支,新分支会复制当前分支已经提交到仓库的内容
git branch <分支名>
# 切换分支
git checkout <分支名>
# 创建一个新分支并切换到新分支
git checkout -b <分支名>
# 删除本地分支,会阻止删除包含未合并更改的分支
git branch -d <分支名>
# 强制删除一个本地分支,即使是包含未合并更改的分支
git branch -D <分支名>
# 删除远程分支
git push origin :<分支名>
# 或
git push origin --delete <分支名>
# 修改当前分支名称
git branch -m <分支名>Merge
1
2
3
4
5
6# 默认的合并方式,fast-forward,HEAD 指针直接指向被合并的分支
git merge
# 禁止快进式合并
git merge --no-ff
#
git merge --squashTags
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# 在指定的 commit id 上创建一个标签
git tag <标签名> <commit_id>
# 默认在 HEAD 上创建一个标签
git tag <标签名>
# 创建带有说明的表亲啊
git tag -a <标签名> -m "tag message"
# 查看所有标签
git tag
# 推送一个本地标签
git push origin <标签名>
# 推送所有本地标签
git push origin --tags
# 删除本地标签
git tag -d <标签名>
# 删除一个远程标签
git push origin :refs/tags/<标签名>Checkout
1
2
3
4
5
6
7
8
9
10# 恢复暂存区的指定文件到工作区
git checkout <filename>
# 恢复暂存区的所有文件到工作区
git checkout .
# 回滚到最近的一次提交
git checkout HEAD
# 回滚到最近一次提交的上一个版本
git checkout HEAD^
# 切换到指定 commit
git checkot <commit id>Clean
从当前文件夹开始,通过递归删除的方式删除不在版本控制中的文件。
1
2
3
4
5
6# 从工作区移除没有被追踪的文件
git clean -f
# 从工作区移除没有被追踪的目录和文件
git clean -fd
# 查看 clean 命令会删除哪些文件
git clean -nfdReset
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# 从暂存区撤销指定文件的修改,但并不改变工作区
git reset <file>
# 重置暂存区最近的一次提交
git reset
# 相当于
git reset HEAD
# 重置工作区和暂存区
git reset --hard
# 将当前分支的指针指向指定的 commit,同时重置暂存区,工作区不变
git reset <commit id>
# 等价于
git reset --mixed <commit id>
# 将当前分支的指针指向指定的 commit,不改变暂存区和工作区
git reset --soft <commit id>
# 将当前分支的指针指向指定的 commit,同时重置暂存区和工作区
git reset --hard <commit id>Revert
1
2
3
4
5
6# 生成一个撤销最近一次提交的新提交
git revert HEAD
# 生成一个撤销最近一次提交的上num次提交的新提交
git revert HEAD~num
# 生成一个撤销指定提交的新提交
git revert <commit id>Cherry-pick
1
2# 将指定的提交应用于当前分支
git cherry-pick <commit id>Search
1
git grep "search key word"
在工作目录中查找指定的关键字
一些运用场景
撤销提交到远程的某些提交
1
2
3
4
5
6
7
8
9
10
11
12
13# 通过 `git log` 命令来获得指定的某次提交的 `id`
git reset [<mode>] [<commit>]
# 这个命令将当前分支的 `head` 指针指向指定的 `commit` 而且可能会根据选择的 `mode` 更新索引和工作树
# 如果 `mode` 省略,则默认值是 `--mixed`
# `--soft` 仅仅只是将 `head` 指向指定的 `commit`
# `--mixed` 会重置索引,但不会重置工作区
# `--hard` 重置索引和工作区,任何在指定的 `commit` 之后的修改将被丢弃
# `--merge`
# `--keep`
git reset --hard <commit_id>
# 然后将重置后的 `branch` 推送到远程仓库
# `--force` 会使用本地分支的提交覆盖远程分支的提交
git push origin HEAD --force保存当前未提交修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# 将当前未提交的修改保存下来,工作目录的 Head 回到上一提交
git stash
# or
git stash save 'message'
# 列出通过 stash 保存的修改
git stash list
# 列出 stash 的修改与 上一次提交的 diff
git stash show
# 恢复之前通过 stash 保存的修改
# 这个命令将第一个 stash 恢复,并从 stash 列表中删除
git stash pop
# 或者使用 apply 命令将修改恢复,但不从 stash 列表中删除
git stash apply
# 手动删除指定的 stash
git stash drop stash@{0}更换远程仓库
1
2
3
4
5
6# 删除远程仓库地址
git remote rm origin
# 添加远程仓库地址
git remote add origin <remote_git_address>
# 推送本地所有分支
git push --all origin -ufast-forward与no-fast-forward合并当执行
get merge命令时,git 会根据当前分支和目标分支(将要合并的分支)的状况不同而选择合适的合并方式。- 如果当前分支与目标分支相比没有额外的提交时,执行
fast-foward合并,fast-foward合并不会产生新的提交,而是将目标分支的提交直接合并到当前分支
- 如果当前分支与目标分支相比没有额外的提交时,执行
如果当前分支与目标分支相比有目标分支并没有的提交,执行
no-fast-foward合并,这会产生新的提交,这个提交的父提交既指向当前分支,也指向目标分支。1
git merge dev
变基
git rebase会将指定分支的