背景
Git目前已成为比较流行的版本管理工具, 该文档记录使用Git过程中碰到的相关问题和解决方案.
问题集锦
将远程仓库回退到指定版本
1 2 3 4
| # # git reset git push origin <分支名>
|
为已存在的项目添加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
|
branch
1 2
| git remote prune origin
|
重建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
|
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/<标签名>
|
放弃本地修改,强制拉取更新
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
|
修改已提交日志中的提交者用户名和邮箱
修改最近一次
批量修改
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
|
代码合并
1 2 3 4 5 6 7 8 9 10 11 12 13
| git checkout branch_1
git cherry-pick 38361a55
git checkout branch_1 git merge branch_2
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 2 3
| git fetch --all git reset --hard origin/master (这里master要修改为对应的分支名) git pull
|
碰到的问题
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
push 失败
1 2 3
| error: 推送一些引用到 'git@github.com:arccode/wechat-pay-sdk.git' 失败 提示:更新被拒绝,因为您当前分支的最新提交落后于其对应的远程分支。 提示:再次推送前,先与远程变更合并(如 'git pull ...')。详见
|
确认没问题,直接强制提交,即git push -f
git status 中文乱码
1
| git config --global core.quotepath false
|
参考资料