最简单放弃本地修改内容
代码语言:javascript复制如果有的修改以及加入暂存区的话
git reset --hard
还原所有修改,不会删除新增的文件
git checkout .
下面命令会删除新增的文件
git clean -xdf
通过存储暂存区stash,在删除暂存区的方法放弃本地修改。
git stash && git stash drop
回滚到某个commit提交
代码语言:javascript复制git revert HEAD~1 # 撤销一条记录 会弹出 commit 编辑
git push # 提交回滚
回退到某一个版本
代码语言:javascript复制git reset --hard <hash>
例如 git reset --hard a3hd73r
--hard代表丢弃工作区的修改,让工作区与版本代码一模一样,与之对应,
--soft参数代表保留工作区的修改。
去掉某个commit
代码语言:javascript复制实质是新建了一个与原来完全相反的commit,抵消了原来commit的效果
git revert <commit-hash>
新建一个空分支
代码语言:javascript复制这种方式新建的分支(gh-pages)是没有 commit 记录的
git checkout --orphan gh-pages
删除新建的gh-pages分支原本的内容,如果不删除,提交将作为当前分支的第一个commit
git rm -rf .
查看一下状态 有可能上面一条命令,没有删除还没有提交的的文件
git status
合并多个commit
代码语言:javascript复制这个命令,将最近4个commit合并为1个,HEAD代表当前版本。
将进入VIM界面,你可以修改提交信息。
git rebase -i HEAD~4
可以看到其中分为两个部分,上方未注释的部分是填写要执行的指令,
而下方注释的部分则是指令的提示说明。指令部分中由前方的命令名称、commit hash 和 commit message 组成
当前我们只要知道 pick 和 squash 这两个命令即可。
--> pick 的意思是要会执行这个 commit
--> squash 的意思是这个 commit 会被合并到前一个commit
我们将 需要保留的 这个 commit 前方的命令改成 squash 或 s,然后输入:wq以保存并退出
这是我们会看到 commit message 的编辑界面
其中, 非注释部分就是两次的 commit message, 你要做的就是将这两个修改成新的 commit message。
输入wq保存并推出, 再次输入git log查看 commit 历史信息,你会发现这两个 commit 已经合并了。
将修改强制推送到前端
git push -f origin master
修改远程Commit记录
代码语言:javascript复制git commit --amend
amend只能修改没有提交到线上的,最后一次commit记录
git rebase -i HEAD~3
表示要修改当前版本的倒数第三次状态
将要更改的记录行首单词 pick 改为 edit
pick 96dc3f9 doc: Update quick-start.md
pick f1cce8a test(Transition):Add transition test (#47)
pick 6293516 feat(Divider): Add Divider component.
Rebase eeb03a4..6293516 onto eeb03a4 (3 commands)
Commands:
p, pick = use commit
r, reword = use commit, but edit the commit message
e, edit = use commit, but stop for amending
s, squash = use commit, but meld into previous commit
f, fixup = like "squash", but discard this commit's log message
x, exec = run command (the rest of the line) using shell
d, drop = remove commit
保存并退出,会弹出下面提示
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
通过这条命令进入编辑页面更改commit,保存退出
git commit --amend
保存退出确认修改,继续执行 rebase,
git rebase --continue
如果修改多条记录反复执行上面两条命令直到完成所有修改
最后,确保别人没有提交进行push,最好不要加 -f 强制推送
git push -f origin master
添加忽略文件
代码语言:javascript复制echo node_modules/ >> .gitignore
利用commit关闭一个issue
代码语言:javascript复制这个功能在Github上可以玩儿,Gitlab上特别老的版本不能玩儿哦,那么如何跟随着commit关闭一个issue呢? 在confirm merge的时候可以使用一下命令来关闭相关issue:
fixes #xxx、 fixed #xxx、 fix #xxx、 closes #xxx、 close #xxx、 closed #xxx、
同步fork的上游仓库
代码语言:javascript复制Github教程同步fork教程,在Github上同步一个分支(fork)
设置添加多个远程仓库地址。
在同步之前,需要创建一个远程点指向上游仓库(repo).如果你已经派生了一个原始仓库,可以按照如下方法做。
$ git remote -v
List the current remotes (列出当前远程仓库)
origin https://github.com/user/repo.git (fetch)
origin https://github.com/user/repo.git (push)
$ git remote add upstream https://github.com/otheruser/repo.git
Set a new remote (设置一个新的远程仓库)
$ git remote -v
Verify new remote (验证新的原唱仓库)
origin https://github.com/user/repo.git (fetch)
origin https://github.com/user/repo.git (push)
upstream https://github.com/otheruser/repo.git (fetch)
upstream https://github.com/otheruser/repo.git (push)
同步更新仓库内容
代码语言:javascript复制同步上游仓库到你的仓库需要执行两步:首先你需要从远程拉去,之后你需要合并你希望的分支到你的本地副本分支。从上游的存储库中提取分支以及各自的提交内容。 master 将被存储在本地分支机构 upstream/master
git fetch upstream
remote: Counting objects: 75, done.
remote: Compressing objects: 100% (53/53), done.
remote: Total 62 (delta 27), reused 44 (delta 9)
Unpacking objects: 100% (62/62), done.
From https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY
* [new branch] master -> upstream/master
检查你的 fork’s 本地 master 分支
git checkout master
Switched to branch 'master'
合并来自 upstream/master 的更改到本地 master 分支上。 这使你的前 fork’s master 分支与上游资源库同步,而不会丢失你本地修改。
git merge upstream/master
Updating a422352..5fdff0f
Fast-forward
README | 9 -------
README.md | 7
2 files changed, 7 insertions( ), 9 deletions(-)
delete mode 100644 README
create mode 100644 README.md
批量修改历史commit中的名字和邮箱
- 克隆仓库
注意参数,这个不是普通的clone,clone下来的仓库并不能参与开发
代码语言:javascript复制git clone --bare https://github.com/user/repo.git
cd repo.git
- 命令行中运行代码
OLD_EMAIL原来的邮箱
CORRECT_NAME更正的名字
CORRECT_EMAIL更正的邮箱
将下面代码复制放到命令行中执行
git filter-branch -f --env-filter '
OLD_EMAIL="wowohoo@qq.com"
CORRECT_NAME="小弟调调"
CORRECT_EMAIL="更正的邮箱@qq.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
执行过程
代码语言:javascript复制Rewrite 160d4df2689ff6df3820563bfd13b5f1fb9ba832 (479/508) (16 seconds passed, remaining 0 predicted)
Ref 'refs/heads/dev' was rewritten
Ref 'refs/heads/master' was rewritten
- 同步到远程仓库
同步到push远程git仓库
代码语言:javascript复制git push --force --tags origin 'refs/heads/*'
我还遇到了如下面错误,lab默认给master分支加了保护,不允许强制覆盖。Project(项目)->Setting->Repository 菜单下面的Protected branches把master的保护去掉就可以了。修改完之后,建议把master的保护再加回来,毕竟强推不是件好事。
代码语言:javascript复制remote: GitLab: You are not allowed to force push code to a protected branch on this project.
当上面的push 不上去的时候,先 git pull 确保最新代码
代码语言:javascript复制git pull --allow-unrelated-histories
或者指定分枝
代码语言:javascript复制git pull origin master --allow-unrelated-histories