git loggit refloggit diff一般都在图形工具中使用,所以暂时未列出

执行所有的git命令,都可以使用-C <path>指定工作目录。如:
git -C /home init demo等同于在/home目录下执行git init demo命令

init - 初始化仓库

1
2
3
git init <name>           # 在当前目录下新建一个本地仓库
git init <path> # 在指定目录下新建一个本地仓库,仓库名称为path的最后一段
git -C <path> init <name> # 在<path>目录下新建一个本地仓库

config - 信息配置

1
2
git -C <path> config user.name "<你的姓名>"  # 设置仓库提交人姓名
git -C <path> config user.email "<你的邮箱>" # 设置仓库提交人邮件地址

局部

1
2
git config user.name "<你的姓名>"
git config user.email "<你的邮箱>"

全局

1
2
3
4
5
6
git config --global user.name "<你的姓名>"
git config --global user.email "<你的邮箱>"
git config --global credential.helper store
git config --global pull.rebase true
git config --global core.quotepath false
git config --global core.autocrlf false

使用密码帮助程序记录账号和秘密

1
git config --global credential.helper store

设置git pull时默认为变基

1
git config --global pull.rebase true

文件路径Unicode码处理

1
git config --global core.quotepath false

换行符处理

1
git config --global core.autocrlf false
  • true

    表示在推送时转成 \n,在拉取时转成 \r\n。这样的设置让 Windows 的开发者能兼容很多的开发工具(比如早期的记事本,新的已经支持 \r\n 了),不至于遇到很多换行符问题。

  • false

    表示在推送时和拉取时都原样保留换行符。git 完全不处理换行符,全部改由开发者自行解决。

  • input

    表示在推送时转成 \n,在拉取时原样保留换行符。注意到,这样的设置会让仓库里所有的换行符都变成 \n 不再有什么时候有 \r\n 了。

add - 文件追踪

git commit只会提交已经git add修改

1
2
3
git add <file-name> # 追踪指定文件的最新状态,支持 linux 下文件通配符。如 *.js 等
git add -A # 追踪当前仓库下所有文件
git add . # 追踪当前目录及其子目录下所有文件,如果处于仓库根目录,和 git add -A 表现一致

commit - 提交

提交只是将代码存储在了本地仓库,需要结合git push才能将代码推送到远程仓库与其他小伙伴共享

1
2
3
4
5
git commit                          # 不添加提交信息的提交
git commit -m "message" # 提交的message信息并设置信息为 -m 后的信息
git commit -a # 等于 git add -A 和 git commit 两个命令的快捷方式
git commit --amend # 修改最后一次提交的message信息,此操作会打开文本编辑器
git commit --amend -m "New message" # 修改最后一次提交的message信息并设置信息为 -m 后的信息
1
git commit --amend -m "New message"

它的原理是产生一个新的提交对象,替换掉上一次提交产生的提交对象。

这时如果暂存区有发生变化的文件,会一起提交到仓库。所以,--amend 不仅可以修改提交信息,还可以整个把上一次提交替换掉。

push - 推送

1
2
3
4
5
6
7
8
9
10
11
git push origin master              # 提交本地master分支到远程git仓库的默认分支不建立跟踪
git push -u origin master # 提交本地master分支到远程git仓库的默认分支并建立跟踪
git push origin A:B # 提交本地A分支到远程B分支
git push origin :B # 删除远程B分支(推送空分支到远程B分支)
git push origin --delete B # 删除远程B分支(git1.7之后才支持)
git push --tags # 推送所有标签
git push origin v1.0 # 推送本地v1.0标签到远程v1.0标签
git push origin v1.0:refs/tags/v2.0 # 推送本地v1.0标签到远程v2.0标签
git push origin :refs/tags/v2.0 # 删除远程标签v2.0
git push <remote> <branch> --force # 强制推送本地分支并覆盖远程分支
git push <remote> <branch> -f # 强制推送本地分支并覆盖远程分支

若有 branchtag 重名,则需要明确区分即可。

对象 路径
branch refs/heads/branch_name
tag refs/tags/tag_name

pull - 拉取远程代码并自动合并

1
2
git pull                      # 从远程的默认分支下载最新的版本到本地默认分支上并合并
git pull origin master:master # 从远程的origin的master主分支下载最新的版本到本地origin/master分支上

fetch - 拉取远程代码不合并

1
2
3
git fetch                      # 从远程的默认分支下载最新的版本到本地默认分支上
git fetch -p # 拉取远程到本地,并更新本地和远程的对应关系
git fetch origin master:master # 从远程的origin的master主分支下载最新的版本到本地origin/master分支上

merge - 合并

1
2
3
git merge <branch>         # 将指定分支并入当前分支。Git 会决定使用哪种合并算法。
git merge --no-ff <branch> # 将指定分支并入当前分支,但总是生成一个合并提交(即使是快速向前合并)。
# 这可以用来记录仓库中发生的所有合并。

checkout - 代码检出操作

1
2
3
4
5
6
7
8
9
git checkout --orphan <new-branch>     # 创建一个干净的分分支,不保留任何提交记录
git checkout <branch> # 切换到指定的分支
git checkout <branch> <rbranch> # 获取对应远程分支到对应本地分支(需要提前建立本地分支)
git checkout <fileName> # 恢复未commit的文件
git checkout -b <new-branch> # 创建一个本地新分支(-b 的意思是 base,以当前分支为 base,
# 新建一个名叫【<new-branch>】的分支)
git checkout -b <new-branch> <rbranch> # 从远程分支创建并切换到新分支
git checkout -b <new-branch> origin/<rbranch> # 适用于有多个远程仓库
git checkout -b <new-branch> refs/tags/<tag-name> # 从tagName创建并切换到新分支

clone - 仓库拉取

1
2
3
git clone <url> <local-path>         # 拉取仓库到本地指定路径
git clone -b dev <url> # 拉取 dev 分支
git clone --depth 1 <url> # 拉取最后一个版本代码

branch - 分支操作

1
2
3
4
5
6
7
8
9
10
11
12
git branch                    # 查看本地分支
git branch -r # 查看远程分支
git branch -a # 查看远程和本地分支
git branch <new-branch> # 从当前分支创建一个新分支
git branch remotes/origin/A # 切换到远程 origin/A 分支
git branch -m <new-branch> # 更改当前分支名称为<new-branch>
git branch -d <branch> # 删除一个分支
git branch -D <branch> # 强制删除一个分支
# 快速删除所有远程没有的本地分支
git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d
git branch -u origin/<branch> # 建立本地当前分支与远程分支的关联
git branch -u origin/b a # 建立本地分支a与远程分支b的关联

stash - 工作目录暂存

1
2
3
4
5
6
git stash                 # 暂存工作目录当前状态,并还原到工作目录为上一次提交状态
git stash list # 显示所有暂存的记录,下面的stash@{0}即用此命令查询
git stash apply stash@{0} # 还原工作目录到名为[stash@{0}]的暂存记录
git stash pop stash@{0} # 恢复文件的同时,将stash@{0}删除
git stash drop stash@{0} # 将stash@{0}删除
git stash branch <branch> # 从储藏中创建分支

执行git stash list后显示的结果

1
2
3
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log

忽略跟踪

1
2
git update-index --assume-unchanged <file-path> # 忽略跟踪<file-path>文件
git update-index --no-assume-unchanged <file-path> # 撤销忽略跟踪<file-path>文件(恢复<file-path>文件的跟踪)

reset - 回退提交

1
git reset [<mode>] [<commit>]

mode:
–soft:只回退commit信息,不更改文件索引,不删本地代码,若要提交可直接执行git commit
–mixed:回退commit信息和文件索引,不删本地代码,如果还要提交,需要git add然后commit
–hard:回退commit信息、文件索引并删除本地代码

commit:
通过git loggit reflog查看

示例

1
2
3
4
5
6
7
8
9
10
# 回退到本地存储的最新版本并删除本地所有未暂存的文件
git reset --hard HEAD

# 回退到上一个版本
git reset --soft HEAD^
# 或者
git reset --soft HEAD~

# 回退到100个版本前,不写--hard默认是--mixed)
git reset –hard HEAD~100

cherry-pick - 拣选

无论是对单个 commit 进行 cherry-pick ,还是批量处理,注意一定要根据时间线,依照 commit 的先后顺序来处理,否则会有意想不到的问题。

1
2
3
4
5
6
7
8
git cherry-pick <commit-id>               # 合并某次提交内容
git cherry-pick <commit-id1> <commit-id2> # 合并多次提交内容
git cherry-pick –n <commit-id> # 合并之后不提交
git cherry-pick --no-commit <commit-id> # 合并之后不提交
git cherry-pick -x <commit_id> # 增加 -x 参数,表示保留原提交的作者信息进行提交
git cherry-pick --continue # 当发生冲突并解决后继续合并
git cherry-pick --quit # 忽略当前的操作。可以用来清除失败的cherry-pick或revert
git cherry-pick --abort # 取消操作并返回到pre-sequence状态

tag - 标签管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
git tag                             # 查看本地标签
git tag v1.0 # 新建v1.0标签,没有注释
git tag -ln5 # 查看所有标签的5行注释,不写5则只显示一行
git tag -ln5 v1.0 # 查看v0.1标签的5行注释,不写5则只显示一行
git tag -a v1.0 # 新建v0.1标签,并进入文本编辑器编写注释
git tag -a v1.0 9fceb02 # 从提交记录[9fceb02]创建一个标签,并进入文本编辑器编写注释
git tag -a v1.0 -m "xx" # 新建v1.0标签,并增加标签注释为[xx]
git tag -a v1.0 -m "xx" master # 从master新建标签为v0.1,并增加注释[xx]
git tag -d v1.0 # 删除本地标签v1.0
git show v1.0 # 查看v1.0标签的提交信息
git push --tags # 推送所有标签
git push origin v1.0 # 推送本地v1.0标签到远程v1.0标签
git push origin v1.0:refs/tags/v2.0 # 推送本地v1.0标签到远程v2.0标签
git push origin :refs/tags/v2.0 # 删除远程标签v2.0

remote - 远程仓库操作

1
2
3
4
5
git remote -v                   # 查看远程仓库信息
git remote add origin <url> # 增加一个远程仓库<origin>,地址为<url>
git remote set-url origin <url> # 更改远程仓库<origin>的地址
git remote remove origin # 移除<origin>远程仓库关联
git remote rm origin # 删除远程仓库<origin>

archive - 导出干净的压缩包

1
2
3
4
5
# 将标签对应的版本内容打包成一个tar包或者zip包。
git archive --format=tar v1.0.0 |gzip > mysite-1.0.0.tar.gz
git archive --format=zip v1.0.0 > mysite-1.0.0.zip
git archive --format=zip HEAD > mysite.zip
git archive --format=zip –prefix=mysite/ v1.0.0 > mysite-1.0.0.zip

--format 指明要产生tar格式的输出。
--prefix 指明包中所有东西都放到mysite/目录下。

rm - 删除git上已经提交的文件

1
2
3
4
5
6
git rm <file-name>             # 从版本库和本地磁盘上删除
git rm -r <file-name> # 从版本库和本地磁盘上递归删除目录和文件
git rm -r --cached <file-name> # 只从版本库中删除,本地仍旧保留
git rm -f <file-name> # 强制从版本库和本地磁盘上删除文件
git rm -rf <file-name> # 你懂的,删库跑路那种。
git rm -rn <file-name> # 查看有哪些文件可以删除,但是不真执行删除

<file-name>支持通配符。
加上-n参数,执行命令时,是不会删除任何文件,而是展示此命令要删除的文件列表预览,所以一般用这个参数先看看要删除哪些文件,防止误删,确认之后,就去掉此参数,真正的删除文件。

统计

1
2
git shortlog --numbered --summary # 统计每个人的提交次数
git log --oneline | wc -l # 显示总的提交次数

svn - SVN 仓库同步操作

默认的 SVN 仓库会有三个子目录:
trunk:仓库主目录,等效 git 的master分支
branches:分支存放目录,等效 git 里除master以外的分支
tags:标签存放目录,等效 git 里标签

1
2
3
4
5
6
7
8
9
10
# 在本地初始化一个 git 仓库,然后从 SVN 仓库拉取代码到此 git 仓库中
# -T 或 --trunk 指定 git 里 master 分支使用 svn 仓库里的哪个目录下的代码
# -b 或 --branches 指定 git 里除 master 分支以外的分支对应 svn 仓库里哪个目录下的代码
# -t 或 --tags 指定 git 里标签对应 svn 仓库里哪个目录下的代码
git svn clone <svn-url> -T <trunk> -b <branches> -t <tags>
git svn clone --stdlayout <svn-url> # --stdlayout 等效 -T trunk -b branches -t tags
git svn clone -s <svn-url> # --stdlayout 的缩写形式

git svn rebase #获取svn仓库的更新
git svn dcommit #提交到svn仓库

SVN迁移操作可参考《SVN迁移到Git(整理)》

多人协作工作模式

多人协作工作模式一般是这样的:
首先,可以试图用git push origin branch-name推送自己的修改。
如果推送失败,则因为远程分支比你的本地更新早,需要先用git pull试图合并。
如果合并有冲突,则需要解决冲突,并在本地提交。再用git push origin branch-name推送。

hooks

查看项目 hooks 目录

1
git config core.hooksPath

全局操作

1
git config --global core.hooksPath

设置项目 hooks 目录

1
git config core.hooksPath .husky

恢复默认 hooks 目录

1
git config --unset core.hooksPath