git通用操作集锦

背景

Git目前已成为比较流行的版本管理工具, 该文档记录使用Git过程中碰到的相关问题和解决方案.

问题集锦

1. 将远程仓库回退到指定版本

1
2
3
4
# --hard 参数会抛弃当前工作区的修改 
# --soft 参数会会退到之前的版本, 但保留当前工作区的修改, 可以重新提交
git reset --hard <版本号>
git push origin <分支名> --force

2. 为已存在的项目添加git

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 进入命令行, 切换至项目根目录(工作区)
cd path/to/proj
# 添加.ignore文件, 排除不需要提交的文件
# 初始化本地仓库
git init
# 查看git配置信息
git config --list
# 修改提交人信息
# 将项目中所有文件添加至暂存区(index/stage)
git add .
# 将暂存区的内容提交到本地仓库(HEAD)
git commit -m "初始化项目"
# 添加远程仓库
# 如果出现"fatal: remote origin already exists.​", 说明已添加过仓库, 执行"git remote rm origin"后, 再进行添加
git remote add origin + 目标仓库
# 将本地仓库内容提交至远程仓库
git push -u origin master

3. branch

1
2
# 删除git branch -a 中不存在的远程分支
git remote prune origin

4. 重建master分支

1
2
3
4
5
6
7
8
9
10
11
12
# 删除本地分支(merge了的分支)
git branch -d <分支名>
# 删除本地分支(不管有没有merge)
git branch -D <分支名>
# 删除远程分支(方法一)
git push --delete origin <分支名>
# 删除远程分支(方法二)
git push origin :<分支名>
# 新建master分支
git branch -b master
# 推送至远程
git push -u origin master

5. tag

1
2
3
4
5
6
7
8
# 新建标签
git tag -a <标签名> -m "标签备注"
# 推送标签至远程
git push origin --tags
# 删除远程标签(方法一)
git tag -d origin <标签名>
# 删除远程标签(方法二)
git push origin :refs/tags/<标签名>

6. 放弃本地修改,强制拉取更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 下载远程仓库最新内容,不做合并
git fetch --all
# 把HEAD指向master最新版本
git reset --hard origin/master
# 拉取代码,可省略
git pull
# 本地所有修改的。没有的提交的,都返回到原来的状态
git checkout .
# 把所有没有提交的修改暂存到stash里面。可用git stash pop回复。
git stash
# 返回到某个节点,不保留修改。
git reset --hard HASH
#返回到某个节点。保留修改
git reset --soft HASH
# 返回到某个节点
# -n 显示将要删除的文件和目录
# -f 删除文件
# -df 删除文件和目录
git clean 参数
# 组合命令
git checkout . && git clean -xdf

7. 修改已提交日志中的提交者用户名和邮箱

修改最近一次

1
git commit --amend --author="userName <userEmail>"

批量修改

1
2
3
4
5
6
7
git filter-branch --env-filter '
if [ "$GIT_AUTHOR_NAME" = "oldName" ]
then
export GIT_AUTHOR_NAME="newName"
export GIT_AUTHOR_EMAIL="newEmail"
fi
' ref..HEAD

8. 代码合并

1
2
3
4
5
6
7
8
9
10
11
12
13
# 合并 branch_2的某个 commit 至 branch_1
git checkout branch_1
# 这个 38361a55 号码,位于branch_2 分支中;正常情况下,会正常提交,如果有冲突,解决冲突后手动提交
git cherry-pick 38361a55

# 合并 branch_2 的修改 至 branch_1,无冲突自动提交,有冲突,解决冲突后手动提交
## 方案一
git checkout branch_1
git merge branch_2

## 方案二,使用 IDEA
git -> 切换至 branch_1
项目右键 -> git -> repository -> Merge Changes -> 选择 branch_2

分别修改AUTHOR_NAME和COMMITTER_NAME,不太清楚二者的区别。
好像GIT_AUTHOR是用来在push时验证用户信息的,所以可以只修改第一个。
其中ref是起始commit的sha-1的简写,指定生效范围为此commit(exclude)到HEAD(include),避免对整个git的提交历史的修改,可以缩短运行时间。
这一方法不知会不会影响已push过的commit,不过一般都是因为用户名没有push权限,才需要纠正commit的用户名,所以无需在意。

碰到的问题

  1. cannot create a new backup
1
2
3
Cannot create a new backup.
A previous backup already exists in refs/original/
Force overwriting the backup with -f

添加-f即可,即git filter-branch -f --env-filter

  1. push 失败
1
2
3
error: 推送一些引用到 'git@github.com:arccode/wechat-pay-sdk.git' 失败
提示:更新被拒绝,因为您当前分支的最新提交落后于其对应的远程分支。
提示:再次推送前,先与远程变更合并(如 'git pull ...')。详见

确认没问题,直接强制提交,即git push -f

参考资料

转载

本文出自<<arccode>>, 欢迎转载, 转载请注明出处.