## 分支 branch
创建本地新分支,并同步到远程
```
git checkout -b <branch>
git push -u origin <branch>
```
创建新分支,并推送到远程
```
git branch <branch>
git checkout <branch>
git push --set-upstream origin <branch>
```
删除分支
```
删除本地分支
git branch -d <branch>
删除远程分支
git push -d origin <branch>
```
重新设置track到远程分支
```
git branch --set-upstream-to origin/branch
git branch —set-upstream-to=origin/remote_branch local_branch
```
找出包含commit的分支名
```
git branch —contains <sha1> —all
```
远程分支删除后本地无法pull
```
git gc —prune=now
git remote prune origin
```
分支改名
```
不在本分支
git branch -m original_branch_name new_branch_name
在本分支
git branch -m new_branch_name
重命名远程分支,只能删了重建
```
## 标签 tag
打标签
```
git tag <tag>
git push origin <tag>
```
删除标签
```
删除本地标签
git tag -d <tag>
删除远程标签
git push origin :refs/tags/<tag> (refspec)
git push origin --delete tag <tag>
```
列出所有标签
```
git tag -l (本地标签)
```
签出标签
```
git checkout <tag>
```
## 补丁patch
打补丁
```
git diff > a.patch
git apply —check a.patch
git apply a.patch
```
## 版本回退 reset
```
git reset --hard HEAD^ 回退上一个版本(windows的cmd控制台把^做为换行符)
git reset --hard HEAD~1 回退1个版本
git reset --hard commit_id 回退特定版本
git reflog 操作记录,用于向前回退的查找commit_id
```
## 差异 diff
```
4种差别:
1: 暂存区(索引区)跟工作区的文件差别
git diff, 暂存区是原始文件(源),工作区是目标文件
2: 某一提交与工作区的差别
git diff commit_id, git diff HEAD(最近的提交),版本库是源,工作区是目标
3: 某一提交与暂存区的差别。版本库是源,暂存区是目标
git diff --cached
4: 比较两个提交之间的差别
git diff commit_id1 commit_id2 filename (第一个是源,第二个是目标)
```
## 子模块 submodule
添加子模块
```
git submodule add <sub-repo-name.git> <sub-repo-name>
```
克隆repo和子submodule
```
git clone --recursive <repo-name.git>
```
忽略submodule的变化,需要添加忽略项到.gitmodules
```
[submodule "sub-repo-name"]
path = sub-repo-name
url = sub-repo-name.git
ignore = dirty
```
**ignore设置有3种选项**
- `untracked` 忽略子模块中新增的,未被版本控制的文件
- `dirty` 忽略子模块中被版本控制的文件
- `all` 忽略 `untracked` 和 `dirty`
## 版本管理 version control
修改上次提交的备注
```
git commit --amend -m "hello world"
```
生成代码库里track的文件列表
```
git ls-tree -r HEAD --name-only > repo.txt
```
Linux中拷贝repo目录
```
cp -r -L <source-repo-dir> <dest-repo-dir>
```