设置
全局设置
全局设置使用 gig config --global 参数,全局配置文件路径 ~/.gitconfig ,即家目录下。
- 中文文件名或路径被转义
在使用git的时候,经常会碰到有一些中文文件名或者路径被转义成\xx\xx\xx之类的
示例:fang/\344\272\244\346\230\223\346\265\201\347\250\213/
解决方案:xmt@server005:~$ git config --global core.quotepath false
Windows中回车换行符的处理
github处理回车换行git config --global core.autocrlf true别名或者短命令
alias
对于比较长的命令可以使用tab键补全,也可以通过alias定制命令的别名来缩短:
格式:git config --global alias.新名称 '完整命令'。
示例:git config --global alias.l 'log -1',即git log -1查看最近一条提交记录,可以使用短命令git l来实现。
也可以直接打开 ~/.gitconfig 文件,批量修改:
1 | [core] |
当前仓库设置
使用 git config 时不带 --global 参数,可以针对每个仓库做定制化。
配置文件在每个仓库下面:.git/config
- 用户名和邮箱
1 | xmt@server005:~$ git config user.name xmt |
分支
查看所有分支(本地和远程)
git branch -a 或者 git branch -av
新建分支
git branch test_branchgit checkout –b test_branch
新建空分支
git checkout --orphan empty_branch
空分支不会有任何提交历史,通常可以用来新建 todo 或者 docs 分支。git rm -rf . ;git commit -m 'new empty branch,在提交修改后(也就是生成一次提交记录),分支才能通过 git branch -a 查看到。
删除分支
git branch -d test_branch 或者 git branch -D test_branch
新建远程分支
git push origin <branchName>:<branchName>
注释:origin 是默认的远程版本库名称,事实上 git push origin master 的意思是 git push origin master:master 。将本地的 master 分支推送至远端的 master 分支,如果没有就新建一个
删除远程分支和 tag
- 方法
1
1 | git push origin --delete <branchName> |
- 方法
2
1 | git push origin :<branchName> |
提交
重命名目录
1 | git mv ipc 005_ipc |
提交到 stack
回退与恢复
本地修改回退
git reset --hard ab2b3747704c204bd5a810d5c445d4394647cbfb--hard 表示将本地所有修改回退到这个 commit 处
回退 unstage
1 | Changes to be committed: |
比如上面的 .gitignore, data/jobs.txt 两个文件已经通过 git add 添加,但是还没有提交 commit;可以通过 git reset HEAD 回退到 unstage 状态。
修复已提交的错误
已提交是指 commit 后但是没有 push 到远程仓库。如果已经 push 到远程仓库,无法修改。
- 修复后新建一个
commit提交
这种方法是最简单的,但是会形成多余的commit。 - 共用上次错误提交的
commit
不管是想修改文件还是提交记录,都可以使用git commit --amend来修复上次错误提交。如果仅仅是修改提交记录,直接执行重新编辑提交记录即可。如果是修改代码,需要先add再执行:1
2
3vim a.txt // 修改代码
git add a.txt // 添加到 stage
git commit --amend // 使用上次的 commit 重新提交这次修改
恢复误操作 reflog
- 先查看所有的修改记录
git reflog
1 | $ git reflog |
- 其中
570b79a为误操作 - 回退这个误操作
git reset --hard 0dab5ea
合并 merge
cherry-pick 将分支 A 的提交合入到分支 B
- 查看分支
A上的commitid,如:7eef2cda41edc07c8ee2c5ba5dbc9f1602144c88 - 切换到分支
B,合入这个commitid的修改 git cherry-pick 7eef2cda41edc07c8ee2c5ba5dbc9f1602144c88,合入后会重新生成id
查看提交
查看 log
- 基本命令
git log - 按照指定格式显示
示例:git log --pretty=format:"%an %ae %ad %cn %ce %cd %cr %s"
1 | 选项 说明 |
示例:按照 commit,作者,提交说明这三项查看 log,并通过 | 分隔,方便分析git log --pretty=format:"%H | %an | %s" > log
查看某次提交
- 基本命令:
git show commit_id
1 | xmt@server005:~$ git show 8593d90fd5c35ef6a9d88910651e528116914dd0 |
如果不带 commit_id ,默认为查看最近一次
- 查看某次提交修改了哪些文件,参数
-numstatgit show –numstat 8593d90fd5c35ef6a9d88910651e528116914dd0
查看修改状态
基本命令:git whatchanged 。示例:查看该次提交文件修改状态,如增加,修改,删除等git whatchanged -1 8593d90fd5c35ef6a9d88910651e528116914dd0
修改提交后的作者信息
使用了错误的账号提交 commit 后,需要修改作者信息,参考步骤如下。
修改上次提交的作者信息
- 当前
git仓库设置正确的作者信息git config user.name/email ***,设置正确的作者信息。 - 修改上次提交的作者信息
git commit --amend --reset-author,使用当前作者信息,重新修改上次提交。
修改某次提交的作者信息
找到需要修改的提交
idgit log查看并找到需要修改的提交id,比如如下记录中,需要修改第二条提交记录b9b1f623bab552c47e4f0e78d159fa282bd95632。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17commit ac5da90b4095d391701a74ab77eada36c35dc015
Author: red <red@mail.com>
Date: Mon Feb 18 14:23:46 2019 +0800
update b to c
commit b9b1f623bab552c47e4f0e78d159fa282bd95632
Author: red <red@mail.com>
Date: Mon Feb 18 14:23:21 2019 +0800
update a to b
commit da8a5a3c1039c77146eb9181bbe1778bcebcd797
Author: red <red@mail.com>
Date: Mon Feb 18 14:20:34 2019 +0800
add a.txt使用
git rebase -i命令rebase -i指定到被修改id的前一个id:(或者使用git rebase -i HEAD~n,其中n为倒数第几个提交记录):1
2
3
4
5
6git rebase -i da8a5a3c1039c77146eb9181bbe1778bcebcd797
// 在弹出的编辑框中,将第二条记录前的 pick 修改为 edit,保存退出
edit b9b1f62 update a to b // 目标 id,重置这条记录的作者信息
pick ac5da90 update b to c
# Rebase da8a5a3..ac5da90 onto da8a5a3
修改完毕后,目标 id 提交记录在当前仓库中,成为最后一条提交记录。(那原本的最后一条提交记录呢??向后看)
- 修改上次提交的作者信息
使用git commit --amend --reset-author命令,重置上次提交记录(也就是当前目标id)的作者信息。 - 使用
git rebase --continue命令
使用rebase --continue命令,将分支恢复(即将最后一条提交记录复原)。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19$ git rebase --continue
Successfully rebased and updated refs/heads/master.
$ git log
commit 63df1273b7cc28905e73af4579346fc0d4f3e950
Author: red <red@mail.com>
Date: Mon Feb 18 14:23:46 2019 +0800
update b to c
// 目标 id 的作者信息已经被修改
commit a3c971465967df8332acb8ec5d5117541a892085
Author: modify <modify@mail.com>
Date: Mon Feb 18 14:39:33 2019 +0800
update a to b
commit da8a5a3c1039c77146eb9181bbe1778bcebcd797
Author: red <red@mail.com>
Date: Mon Feb 18 14:20:34 2019 +0800
Patch 相关操作
制作 patch
- 制作单次提交的
patchgit format-patch -1 ab2b3747704c204bd5a810d5c445d4394647cbfb
其中:-1表示单次提交 - 某次提交后的所有修改,每次提交都生成一个
patchgit format-patch -s ab2b3747704c204bd5a810d5c445d4394647cbfb
其中:-s表示某次提交后的所有修改。但不包含当前commit的这次修改
合入 patch
git am patchname.patch
将多个 commit 合并为一个 patch
- 分别将这几个
commit生成对应的patch - 新建两个分支
patches_branch和merge_branchpatches_branch:用于提交多个分散的patchmerge_branch:用于将patches_branche上的修改merge过来,生成单独patch - 两个分支都回退到第一个
commit之前git reset --hard ab2b3747704c204bd5a810d5c445d4394647cbfb--hard表示将本地所有修改回退到这个commit处 patches_branch分支上,通过git am合入第一步生成的所有patch文件merge_branch分支上,将所有修改merge过来,提交并生成一个新的commitgit merge patches_branch –squash
其中:参数–squash表示放弃修改的历史信息- 将这个
commit制作成新的patch。至此,所有修改生成单个patch文件完成
制作两个分支之间差异 patch
从 master 新建 dev 分支,并在 dev 分支上做多次修改提交后,比较 dev 和 master 两个分支间的差异,并生成 patch 文件。
- 比较两个分支间的差异
git log master..dev,查看有多少次修改记录。 - 将两个分支间的差异生成多个
patch文件git format-patch master..dev,每次修改提交都生成一个patch文件。 - 将两个分支间的差异生成一个总的
patch文件git diff master..dev > new.patch,生成单独文件。
注意:
master和dev的顺序不能反,否则不会有任何文件生成。
仓库相关
提交到远程仓库 push
- 默认提交
git push默认提交到远程仓库origin的master分支,默认提交实际对应的命令为git push origin master:master。 - 提交单独分支
git push origin dev:dev,提交dev分支到远程仓库。注意这条命令如果冒号:前面为空,表示删除远程仓库的dev分支。 - 提交所有分支
--allgit push --all origin,将本地所有分支都提交到远程仓库。
远程仓库地址切换
如原始地址为:https://username@163.com@github.com
切换到:git@github.com:username/SoundRecorder.git
- 查看地址
1 | git remote -v |
切换地址
git remote set-url origin git@github.com:username/SoundRecorder.git再次查看确认
1 | git remote -v |
使用两个远程仓库地址同时备份
示例:同时在 github,gitlab 上新建两个 git 仓库
从
github下载仓库git clone git@github.com:username/SoundRecorder.git在当前
git目录下,远程添加新仓库分支git remote set-url --add origin git@gitlab.com:username/SoundRecorder.git
在.git/config文件中查看:1
2
3
4[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = git@github.com:username/SoundRecorder.git
url = git@gitlab.com:username/SoundRecorder.git获取新仓库分支信息
git fetch git@gitlab.com:username/SoundRecorder.git同步新仓库最新文件
git pull git@gitlab.com:username/SoundRecorder.git同步两个仓库,并提交到服务器上
git push origin master后续每次更新后,
push到服务器上时,会同时备份到两个远程仓库git push
使用两个远程仓库地址分别备份
依然使用上面的例子,但是在添加第二个仓库地址时使用 git remote add :
从
github下载仓库git clone git@github.com:username/SoundRecorder.git在当前
git目录下,远程添加新仓库分支git remote add gitlab git@gitlab.com:username/SoundRecorder.git
在.git/config文件中查看,除了默认的远程版本仓库origin外,还多了一个新加的gitlab远程仓库名:1
2
3
4
5
6[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = git@github.com:username/SoundRecorder.git
[remote "gitlab"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = git@gitlab.com:username/SoundRecorder.git后续每次更新后,需要
push2 次,每次备份一个远程仓库github仓库备份:git push origingitlab仓库备份:git push gitlab
上面两条命令仅仅是提交master分支。如果github上需要提交的正式修改,而gitlab上希望备份本地所有分支及其临时修改。可以使用--all强制提交所有分支,或者使用--mirror直接备份所有修改:git push --all gitlab或者git push --mirror git@gitlab.com:username/SoundRecorder.git。并且--mirror备份的方式并不需要新建远程仓库,使用假名在当前本地仓库上(不要设置全局参数)新建一个短命令非常高效,推荐使用--mirror的方式。远程默认仓库
origin
缺省情况下,不需要修改,默认就是origin。如果出现了以外,可以通过命令参数-u改回来:git push -u origin master提交。对应的配置文件为branch.master.remote=origin。
仓库迁移
clone裸仓库git clone --bare https://github.com/exampleuser/old-repository.gitpush mirror
1 | cd old-repository.git |
仓库镜像并更新
镜像仓库
git clone --mirror https://github.com/exampleuser/old-repository.git镜像同步更新
1 | cd old-repository.git |