【linux命令讲解大全】013.Git:分布式版本控制系统的先驱和常用命令清单(二)

2024-03-02 11:26:00 浏览数 (2)

最简单放弃本地修改内容

代码语言: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中的名字和邮箱

  1. 克隆仓库

注意参数,这个不是普通的clone,clone下来的仓库并不能参与开发

代码语言:javascript复制
git clone --bare https://github.com/user/repo.git
cd repo.git
  1. 命令行中运行代码
代码语言:javascript复制
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
  1. 同步到远程仓库

同步到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

0 人点赞