Git常用命令

发布时间 2023-10-22 17:30:21作者: jigsawecho
## 分支 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>
```