常用 Git 命令汇总
Git 命令汇总
1 Git 的一些通用术语
1.1 Git 的几个区
1.2 如何标识 Git 的某次提交
2 Git 配置
2.1 配置
2.2 读取配置
2.3 与 Beyond Compare 集成
2.4 一些常用的配置项
2.5 Alias 配置
3 版本库信息
4 repository 管理
5 branch 管理
6 Tag 管理
7 日志
7.1 查看修改日志
7.2 信息统计
7.3 操作日志
8 改动管理
8.1 信息查看
8.2 工作区与暂存区(Index)互操作
8.3 提交代码
8.4 Stash 管理
8.5 比较
8.6 合并代码
8.7 恢复代码
9 场景演练
9.1 Rollback commit
9.2 批量处理冲突
9.3 更新一个 project 下的所有 repositories
9.4 误 commit 大文件
10 异常处理
10.1 fatal: Unable to create '***/.git/index.lock': File exists.
1 Git 的一些通用术语
1.1 Git 的几个区
- worktree: 工作区
- index/stage: 暂存区
- commit: 本地 repository
- stash: 备份区
1.2 如何标识 Git 的某次提交
- 用 SHA 码标识
- HEAD,表示当前 repository 的最后一次提交
- HEAD^,表示当前 repository 的前一次提交,加两个 ^ 就表示前两次提交
- HEAD~4,表示当前 repository 的前4次提交
2 Git 配置
2.1 配置
# 设置本地用户信息
git config --global user.name "lld"
git config --global user.email lld@163.com # 默认 push 当前 branch
git config --global push.default simple # checkout 时将 LF 换为 CRLF, commit 时自动将 CRLF 换为 LF (适用在 Windows 上开发 Linux 的程序员)
git config --global core.autocrlf true # 只在 commit 时自动将 CRLF 换为 LF (适用在 Linux/Mac 程序员)
git config --global core.autocrlf input # 保留原始的 LF/CRLF 信息 (适用于 Windows 程序员)
git config --global core.autocrlf false # 设定 Notepad++ 为默认的文本编辑器,在提交时如未提供 comments,将自动弹出该文本编辑器
git config --global core.editor '"C:\Program Files (x86)\Notepad++\notepad++.exe"'
2.2 读取配置
可在 C:\Users\用户名\.gitconfig 文件中看到所有的酌置项。
或者使用命令行查看,与设置相似,不加最后的参数就行了
# 读取本地用户信息
git config --global user.name
2.3 与 Beyond Compare 集成
对于 3.0.13 版本,其 .gitconfig 如下所示
[diff]
external = \"C:\\Program Files (x86)\\Beyond Compare 3\\BCompare.exe\"
对于 3.3.5 版本,.gitconfig 如下所示
[diff]
tool = bc3
[difftool]
prompt = false
[difftool "bc3"]
cmd = \"c:/Program Files (x86)/beyond compare 3/bcomp.exe\" "$(cygpath -w $LOCAL)" "$REMOTE"
[merge]
tool = bc3
[mergetool]
prompt = false
[mergetool "bc3"]
cmd = \"c:/program files/beyond compare 3/bcomp.exe\" "$LOCAL" "$REMOTE" "$BASE" "$MERGED"
配置完成后,需使用 git difftool 命令代替 git diff, git mergetool 代替 git merge
2.4 一些常用的配置项
配置项 | 说明 |
---|---|
core.safecrlf |
|
2.5 Alias 配置
可以简化一些操作
# 读取当前 alias 配置
git config --get-regexp alias # 使用 git mylog 命令显示可读性较高的 log
git config --global alias.mylog 'log --pretty=format:"%h - %an, %ad (%ar): %s" --date short'
3 版本库信息
# 获取远端 URL 信息
git remote -v # 查看远端 repository id
git remote show # 远看远端详细 branch 信息
git remote show origin
4 repository 管理
# clone master repository
git clone [repository_url] # clone branch repository
git clone -b [branch_name] [repository_url] # clone 版本库到指定目录
git clone [repository_url] [folder_name] # 新建版本库
mkdir git_test
cd git_test # 初始化 git 环境
git init # 将当前目录加为 Git Repository
git add .
5 branch 管理
# 创建本地 branch
git branch [branch_name] # 切换 branch
git checkout [branch_name] # 创建本地 branch 并切换
git checkout -b [branch_name] # checkout remote branch to local
git checkout -b [local_branch] [remote_branch]
# For ex, git checkout -b release/20160729 remotes/origin/release/20160729 # 将本地 branch 上传至远程
# 可省略 local_branch_name:remote_branch_name 即是推送当前本地分支
# 如果只指定本地分支名,远程分支名默认为本地分支名
# 如果远端没有指定分支名,会自动创建
# 但要小心 :remote_branch_name 表示删除远端分支,即用空分支来覆盖远端分支
git push origin [local_branch_name]:[remote_branch_name] # 获取远程 branch 信息
git branch -a # 刷新远程 branch 信息 (如果其他人创建了远程 branch,本地想获取该 branch 信息)
# 同时该命令将会使用远程 repository 更新本地 repository
git fetch origin # 删除本地的远程 branch 信息,如果该 branch 在远程已被删除 (就是那些显示为红色的 remotes/****)
git fetch -p # 创建与远程 branch 同名本地 branch 并将代码从远程更新至本地
# 假设远程分支名为 dev,本地也想使用同样的分支名
git checkout -b dev origin/dev # 删除本地 branch
git branch -d [branch_name] # 删除远程 branch
git push origin --delete branch_name # 列出 branch 的最后一次 commit 信息
git branch -v # 列出所有 merge 过的 branch
git branch --merged # 列出所有未 merge 过的 branch
git branch --no-merged # branch 改名, 如果是改当前 branch 则 old_name 可省略
git branch -m [old_name] [new_name]
6 Tag 管理
# 查看所有的 tag
git tag # 新建 tag
git tag [tag_name] # 删除 tag
git tag -d [tag_name] # push 到远端
git push origin [tag_name]
7 日志
7.1 查看修改日志
# 查看所有提交记录
git log # 查看某文件的改动历史
git log -- [path] # 查看某文件的改动历史 (简洁版)
git log --oneline -- [path] # 查看某文件的改动历史 (简洁版但SHA完整)
git log --pretty=oneline -- [path] # 查看某文件在某时间范围的改动历史
git log --since 2016-08-08 --until 2016-08-12 -- [path] # 查看某文件在某时间范围的改动历史(近1月)
git log --since 1.months -- [path]
# 查看某文件在某时间范围的改动历史(近7天)
git log --since 7.days -- [path] # 查看某提交者对某文件的改动历史
git log --author="ll52957" -- [path] # 查看每次提交的行数改动,第1个数字为新增行数,第2个数字为删除行数
git log --numstat -- [path] # 显示新增、修改、删除的文件清单
git log --name-status # 显示 ASCII 图形表示的分支合并历史
git log --graph #-p 选项展开显示每次提交的内容差异
git log -p # 用 -2 则仅显示最近的两次更新
git log -2 # pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)
# pretty=tformat: 可以定制要显示的记录格式,这样的输出便于后期编程提取分析
# 下面列出了常用的格式占位符写法及其代表的意义。# #
# 选项# 说明# #
# %s commit 时 -commets 中的说明# #
# %H 提交对象(commit)的完整哈希字串# #
# %h 提交对象的简短哈希字串# #
# %T 树对象(tree)的完整哈希字串# #
# %t 树对象的简短哈希字串# #
# %P 父对象(parent)的完整哈希字串# #
# %p 父对象的简短哈希字串# #
# %an 作者(author)的名字# #
# %ae 作者的电子邮件地址# #
# %ad 作者修订日期(可以用 -date= 选项定制格式)# #
# %ar 作者修订日期,按多久以前的方式显示# #
# %cn 提交者(committer)的名字# #
# %ce 提交者的电子邮件地址
git log --pretty=format:"%h - %an, %ar : %s" # 查看某文件在所有 branch 上的提交
gitk --all -- [path] & # 查看某个文件的相关提交改动记录
git blame [path] --date short
7.2 信息统计
#--stat 显示每次更新的文件修改统计信息,会列出具体文件列表
#--shortstat 统计每个commit 的文件修改行数,包括增加,删除,但不列出文件列表
#--numstat 统计每个commit 的文件修改行数,包括增加,删除,并列出文件列表 # 查看某人在某时间段内的新增/删除行数
git log --author="ll52957" --pretty=tformat: --numstat --since 2016-08-01 | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }' # 仓库提交次数排名前 5(如果看全部,去掉 head 管道即可):
git log --pretty='%an' | sort | uniq -c | sort -k1 -n -r | head -n 5 # 提交数统计
git log --oneline | wc -l # 添加或修改的代码行数
git log --stat | perl -ne 'END { print $c } $c += $1 if /(\d+) insertions/;'
# 显示所有贡献者及其commit数 git shortlog --numbered --summary
7.3 操作日志
# 查看自己做过的操作
git reflog
8 改动管理
8.1 信息查看
# 查看本地代码改动
git status # 查看本地代码改动 (简洁版)
git status -s # Merge 时列出所有冲突的文件
git diff --name-only --diff-filter=U # 查看某文件某次提交时的内容
git show [commit]:[path] # 查看某被删除文件的内容
git show HEAD^:[path] # 查看某文件在某 commit 与上次提交的差异
git show [commit] [path]
8.2 工作区与暂存区(Index)互操作
# 使用通配符将本地改动或新增文件放到暂存区
git add '*.dll' # 将本地所有修改/新增文件放到暂存区
git add . # 将本地删除的文件放到暂存区
git rm file_name # 将本地删除的所有文件放到暂存区
git rm . # 将本地所有新增/修改/删除的文件都提交到暂存区
git add -A # 将本地所有修改/删除过的文件提交到暂存区
git add -u # 将某文件的部分修改放到暂存区
git add -p [path] # 将文件从暂存区恢复至工作区
git reset HEAD [path]
8.3 提交代码
# 将晳存区的文件提交至本地 repository
git commit -m comments # 将本地 repository 改动提交至远程,如果其他人已在远程进行过推送,需使用 pull 命令合并
git push origin [branch]
8.4 Stash 管理
# 将本地所有改动文件标记为 stash 状态
git stash
# 完整的 stash 命令
git stash save "comments" # 显示 stash 区文件列表(默认显示最新)
git stash show [stash id] # 将 stash 文件恢复并删除 stash 进度 (默认最新)
git stash pop [stash id] # 将 stash 文件恢复并保留 stash 进度(默认最新)
$git stash apply [stash id] # 列出 stash 区所有版本
$git stash list # 将 stash 清空
$git stash clean # 删除某个 stash 进度
$git stash drop [stash id]
8.5 比较
8.5.1 所有文件比较
# 比较工作区和暂存区
git diff # 比较本地 repository 和工作区
git diff HEAD # 比较本地 repository 和暂存区
git diff --cached # 比较本地 repository 与远程 repository 区别, 会分页列出改动的文件名及内容,按 q 退出, d 为下一页
git fetch origin
git diff dev origin/dev # 比较本地 repository 与远程 repository 区别,只列出有变化的文件名
git fetch origin
git diff --name-only dev origin/dev # 比较两次提交间的变化
git diff --name-only SHA1 SHA2 # 列出工作区与本地 repository 中的变化的文件列表(也就是工作区与本地 repository 的区别)
git diff --name-only # 列出暂存区与本地 repository 中的变化的文件列表
git diff --name-only --cached # 列出本地 repository 当前版本与前一次提交变化的文件列表
git diff --name-only HEAD^ HEAD # 列出本地 repository 当前版本与前两次提交变化的文件列表
git diff --name-only HEAD^^ HEAD # 列出本地 repository 当前版本与前三次提交变化的文件列表
git diff --name-only HEAD~3 HEAD # 比较不同 commit, commit1 为要较新的 commit,commit2 为较旧的 commit
git diff --name-only commit1..commit2 # 比较当前 branch 与其它 branch
git diff --name-only [branch] # 比较不同 branch, branch1 为要较新的 branch,branch2 为较旧的 branch
git diff --name-only branch1..branch2
git diff branch1..branch2 -- [file path]
8.5.2 单个文件比较
# 比较指定文件在工作区与暂存区/本地 Repository 的差别
# 如果暂存区有该文件则与暂存区比较,否则与本地 repository 比较
git diff -- path # 比较指定文件在暂存区与本地 repository 的区别
git diff --cached -- path # 比较指定文件在本地 repository 与远程 repository 的区别
git diff origin/master -- [path]
git diff HEAD origin/master -- [path] # 比较指定文件在暂存区与远程 repository 的区别
git diff --cached origin/master -- [path] # 比较文件工作区与某次提示的区别
git diff [commit] -- [path] # 比较不同 commit, commit1 为要较旧的 commit,commit2 为较新的 commit
git diff commit1..commit2 -- [path] # 比较当前 branch 与其它 branch
git diff --name-only [branch] -- [path] # 比较不同 branch, branch1 为要较新的 branch,branch2 为较旧的 branch
git diff branch1..branch2 -- [path]
8.6 合并代码
# 从 dev1 branch 合并到当前 branch
git merge dev1 # 从远端代码获取最新改动并合并至当前 branch
git pull origin master # 从远端代码获取最新改动并合并至当前 branch (使用 fetch 和 merge )
# 获取远端change
git fetch origin
# 比较远端代码与本地代码区别
git diff master origin/master
# 合并远端change
git merge origin/master
# 合并远端change的指定文件(同样适用于从其它 branch merge 到当前 branch)
git checkout --patch origin/master [path] # 忽略远程修改,强行用本地代码覆盖远端文件
git push -f origin master
8.6.1 冲突解决
常规情况下,如果是两个人同时修改同一个文件引起的冲突。用文本编辑器查看会看到如下所示的内容
This is the version 1
<<<<<<< HEAD
本地你的修改内容
=======
远程其他人提交的内容
>>>>>>> SHA code
需要在编辑器中合并完修改后,使用 git add 命令提交。
如果如同前文所示配置了 beyond compare 作为 merge 工具,可以使用命令
git mergetool [file_name]
合并完成后保存即可
使用 beyond compare,会自动在本地生成如下文件:
- [file_name].orig: 未合并前的原始文件
- [file_name]_BACKUP_[SHA]: 未合并前的原始文件再备份, 以防你干蠢事
- [file_name]_BASE_[SHA]: 本地代码库中未合并前的版本
- [file_name]_LOCAL_[SHA]: 本地工作区中使用 beyond compare 合并完成后保存的版本
- [file_name]_REMOTE_[SHA]: 远程版本
也就是说, 合并完成后使用"另存为"功能将 [file_name]_LOCAL_[SHA] 替换当前文件即可. 默认情况下你看不到上面这些文件, 但如果使用 Ctrl + C 来结束命令的话这些文件将会被保留.
合并完成后可用如下文件快速删除临时文件
git status -s | grep ?? | cut -d ' ' -f 2 | xargs rm
8.6.2 快速解决冲突的情况
但有如下的情况,可以使用以下命令快速解决
# 产生冲突时忽略远程修改,使用本地版本
git checkout --ours [path] # 产生冲突时忽略本地修改,使用远程版本
git checkout --theirs [path] # 远端文件已删除
git rm [path]
8.6.3 取消合并
有时需要认怂, 放弃本次 merge, 可使用如下命令
git merge --abort
我们会发现 branch name 从 [branch]|MERGING 恢复成了 [branch]
8.7 恢复代码
# 使用暂存区版本恢复到工作区
git checkout -- [path] # 使用某次历史提交覆盖本地修改(覆盖后会自动进入暂存区)
git checkout [commit] -- [path] # 使用最新一次提交覆盖本地工作区版本
git checkout HEAD -- [path] # 使用远程版本覆盖本地工作区版本
git checkout origin/master [path] # 使用远程版本覆盖本地所有改动的文件 (即使有冲突也可以无视)
git fetch --all
git reset --hard origin/master # 回滚到上次提交
# hard 参数表示同时回滚工作区和暂存区,否则只是简单更改 HEAD 指针位置
git reset --hard HEAD^ # 回滚到指定提交(包括回滚后悔了可以用 SHA 码前滚到原状态^_^)
git reset --hard [commit] # 恢复删除后未提交暂存区的文件
git checkout -- [path] # 恢复删除后并已提交暂存区的文件
git reset -- [path]
git checkout -- [path] # 恢复删除后并已提交的文件
# 获取最后一次提交信息
git rev-list -n 1 HEAD -- [path]
# 恢复
git checkout [deleting_commit]^ -- [path]
9 场景演练
9.1 Rollback commit
将 repository 回滚到以前的 commit
# commit "version 1"
# commit "version 2"
# 现在想将 repository 回滚至 version 1 # 将本地 repository 回滚至 commit 前的 add 状态
git reset [commit for version 1] # 使用比较工具进行修后后再次提交
git add .
git commit -m "rollback"
最后的分支树如下所示
9.2 批量处理冲突
有时因为回车换行符产生大量的文件冲突, 可使用如下命令解决
git status -s | grep UU | cut -d ' ' -f 2 | xargs git checkout --theirs
git status -s | grep UU | cut -d ' ' -f 2 | xargs git add
9.3 更新一个 project 下的所有 repositories
folders=$(ls) for f in ${folders}
do
if [ -d ${f} ]; then
echo "processing " ${f}
cd ${f}
git pull origin
cd ..
fi
done
9.4 误 commit 大文件
git rm --cached giant_file
git commit --amend -CHEAD
git push origin
10 异常处理
10.1 fatal: Unable to create '***/.git/index.lock': File exists.
完整异常信息如下所示
fatal: Unable to create '***/.git/index.lock': File exists. If no other git process is currently running, this probably means a
git process crashed in this repository earlier. Make sure no other git
process is running and remove the file manually to continue.
因为上一次 git 处理异常中断而引起,如果确认上次 git 操作已运行完,可以强制删除该 .lock 文件
rm -f ***/.git/index.lock
常用 Git 命令汇总的更多相关文章
- 常用Git命令汇总
常用Git命令汇总 跟着R哥来到了新公司(一个从硬件向互联网转型中的公司),新公司以前的代码基本是使用SVN做版本控制,甚至有些代码没有做版本控制,所以R哥叫HG做了一次Git分享,准备把公司所有的代 ...
- 常用 Git 命令清单
我每天使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60-100个命令. 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下 ...
- 常用 Git 命令清单 转
我每天使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60-100个命令. 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下 ...
- Android之常用Git命令
Android之常用Git命令 代码修改后提交步骤:git status:查看代码修改状态git diff:查看代码修改细节,也能看代码空格git add . :添加新加入的代码git commit ...
- 常用 Git 命令清单(摘录)
来源:阮一峰的网络日志 网址:http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html 我每天使用 Git ,但是很多命令记不住. 一般来 ...
- [转]常用 Git 命令清单
作者: 阮一峰 我每天使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60-100个命令. 下面是我整理的常用 Git 命令清单.几个专 ...
- 常用Git命令
Git教程:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 一般来说,日常使用只要 ...
- Git命令汇总(补充篇)
上一篇<Git命令汇总基础篇>总结了使用Git的基本命令,这一篇作为补充主要给大家讲一些平时使用中的技巧和总结 . 学会了这些命令,已经基本解决了使用Git中大部分问题. 1.gitign ...
- 常用 Git 命令清单
http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html 我每天使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命 ...
随机推荐
- windows server 2012配置php环境教程
买了windows系统的服务器(VPS)等之后我们需要一个php环境来搭建自己的项目,这里介绍手工在windows server 2012上面配置php环境的具体步骤,适合使用服务器和VPS等的新手. ...
- Xpath re bs4 等爬虫解析器的性能比较
xpath re bs4 等爬虫解析器的性能比较 本文原始地址:https://sitoi.cn/posts/23470.html 思路 测试网站地址:http://baijiahao.baidu.c ...
- python接口自动化框架
接口测框架 安装教程 需要3.5及以上版本的python pip install -r requirements.txt 使用说明 运行manage.py创建项目 创建的项目在projects目录下 ...
- jvm堆、栈、String常量池
原文地址:http://blog.csdn.net/tophawk/article/details/78704074 程序计数器:它的生命周期与线程相同,线程私有.较小的内存区域,用以完成分支.循环. ...
- Ubuntu安装笔记
Ubuntu安装笔记 前言 先后在台式电脑&奇葩的SurfaceLaptop上装了Ubuntu18.04LTS 收获了去多经验,浪费了去多时间 为了让下次更加的方便, 写一篇博客记录一下 安装 ...
- js 将图片转换为 base64
var img = document.getElementById('s_lg_img'); function getBase64Image(img) { var canvas = document. ...
- BST | 1064 完全二叉搜索树
OJ:https://www.patest.cn/contests/pat-a-practise/1064 (一)23分(3个case未过)代码 建树的规律是我瞎猜的.首先用样例数据分析. 对数据排序 ...
- C语言博客作业4——数组
0.展示PTA总分 一维数组 二维数组 字符数组 1.本章学习总结 1.1学习内容总结 一维数组知识点: 无论是对一维数组还是二维数组进行应用时,我们对其下标的应用十分广泛. 1:一维数组的输入和遍历 ...
- Python网络爬虫神器PyQuery的使用方法
#!/usr/bin/env python # -*- coding: utf-8 -*- import requests from pyquery import PyQuery as pq url ...
- 【Gamma阶段】第十次Scrum Meeting
[Gamma阶段]第十次Scrum Meeting 每日任务内容 今日工作任务 明日待完成任务 完成人 准备测试质量保证的展示材料 准备测试展示视频 赵智源 修复热评的子评论BUG 准备前端技术展示材 ...