git常见场景与冲突处理

常见场景

暂存区

确认暂存区

1
2
3
4
// 增加所有文件到暂存区
$ git add .
// 增加指定文件到暂存区
$ git add [filename]

撤销暂存区

1
2
3
4
5
// 取消所有最新的暂存区文件
$ git reset HEAD .

// 取消缓存区最新的指定文件
$ git reset HEAD REAMDME.md

注意该命令的参数HEAD是要被恢复的版本, 一般选择HEAD, 即恢复到最新的HEAD。

下面撤销commit也使用该命令。

提交

确认提交

1
2
// 进行一次提交并附加消息'message'
$ git commit -m 'message'

撤销提交

git revet

git revert进行一个提交(commit)来恢复其他提交所做的更改。

1
2
3
$ git revert HEAD                  撤销前一次 commit
$ git revert HEAD^ 撤销前前一次 commit
$ git revert commit (比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销也会作为一次提交进行保存。

git reset [version]

该命令会将头部指到指定的版本位置。

例如:

1
2
3
$ git reset HEAD^            # 回退所有内容到上一个版本  
$ git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本
$ git reset 052e # 回退到指定版本

–hard会强制删除之前所有的信息提交. 慎用.

例如

1
2
3
$ git reset –hard HEAD~3  # 回退上上上一个版本  
$ git reset –hard bae128 # 回退到某个版本回退点之前的所有信息。
$ git reset --hard origin/master # 将本地的状态回退到和远程的一样

但是仍然可以恢复.

git log -g 全局找到我们 commit 1 ID
git branch recover_bracch commit 1, 创建一个新的分支,
git merge recover_bracch 然后合并回来,

git restore

git restore是用来将工作区的文件恢复到上一次暂存区的数据。

修改错误的提交

这种情况可能是提交的文件错误或者message写错了.

此时可以使用 git commit --amend来修改.

1
$ git commit --amend

接下来会弹出文本编辑器来修改对应信息, 不同系统不同,可以设置.

其信息大致如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
new repaired message

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date: Mon Mar 28 21:37:11 2022 +0800
#
# On branch main
# Changes to be committed:
# new file: a.txt
# deleted: "\346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243 (2).txt"
#
# Untracked files:
# a
#

第一行就是message, 后面还包含新增或删除的文件

切换到制定提交位置

移动HEAD, 一般使用checkout命令.

格式:

1
2
3
$ git checkout <SHA-1>
$ git checkout HEAD[^/~<num>/^<num>]
$ git checkout 分支[^/~<num>/^<num>]

示例

1
2
3
$ git checkout ea321		// 切换到ea321版本
$ git checkout HEAD^ // 切换到上一个HEAD位置
$ git checkout develop~3 // 切换到develop分支的前三个分支上

提交合并

使用git rebase命令可以合并commit.

格式

1
$ git rebase -i  [startpoint]  [endpoint]

[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。

比如:

1
2
3
// 效果一致
$ git rebase -i HEAD HEAD~3
$ git rebase -i HEAD~3

然后会弹出编辑器.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
pick b4d576b add b.phppick 90bc004 add c.php
pick 45edfda add d.php
#Rebase 36224db..45edfda onto 36224db (3 command(s))#
# 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
#
# These lines can be re-ordered; they are executed from top to bottom.
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything,the rebase will be aborted.#
#Note that empty commits are commented out

然后根据命令修改.

接下来还需要reset一下,才能完rebase.

不同分支合并

还可以将不同的分支合并到到一起,比如将develop分支的前3个提交合并到master上.

使用以下命令:

1
$  git rebase  [startpoint]   [endpoint]  --onto  [branchName]

例如:

1
2
$  git rebase  ab123   ab124  --onto  master
$ git rebase HEAD~3 --onto master

远程仓库同步

设置远程仓库

可以通过git remote或者通过git branch命令来配置远程仓库。

格式

1
2
$ git remote add [name] [url]
$ git branch --set-upstream-to = <upstream>

例如

1
2
3
4
5
// 新增远程仓库
$ git remote add dev https://github.com/vuejs/core.git

// 为当前分支增加上游
$ git branch --set-upstream-to = https://github.com/vuejs/core.git

确认推送

使用git push命令可以使用本地引用更新远程引用,同时发送完成给定引用所必需的对象。

例如

1
2
3
4
5
6
7
8
// 如果配置了远程仓库,则直接git push
$ git push

// 将匹配得分支推送到远程的origin仓库
$ git push origin

// 将匹配得分支推送到远程的origin仓库master分支
$ git push origin master

撤销推送

  1. 本地回退版本

先使用git reset回退版本

1
$ git reset --soft  aa909cff2239536df14820fe086d96305b24e9f1
  1. 通过强制push,将旧版本推送到远程仓库
1
$ git push origin master --force

注意必须添加--force,因为版本是落后的。

分支

新增分支

示例

1
2
3
4
5
// 切换到newBranch分支,如果不存在则创建后再求切换
$ git branch newBranch

// 切换到newBranch分支,如果不存在则创建后再求切换
$ git checkout newBranch

branchswitch命令本就是为了减轻checkout命令而生,所以方法基本一致。

删除分支

同样的可以使用git branch来删除分支。

1
2
3
4
5
// 删除本地分支
$ git branch -d dev1

// 删除一个正打开的分支
$ git branch -D dev1

恢复分支

格式

1
git branch <branch_name> <hash_val>

示例

1
git branch dev1 123d

Git会自行负责分支的管理,所以当我们删除一个分支时,Git只是删除了指向相关提交的指针,但该提交对象依然会留在版本库中。

因此,如果我们知道删除分支时的散列值,就可以将某个删除的分支恢复过来。在已知提交的散列值的情况下恢复某个分支。

可以通过查看本地文件的log文件或者reflog命令来查找。

合并分支

git merge

通过git merge命令,可以将分支合并到一起。

例如

1
2
// 假设当前在matser,且落后dev1一个版本
$ git merger dev

注意这里还有fast-forward--no-ff的区别,

  • fast-forward即直接移动当前分支的头指针到对应的合并位置。条件是两个分支不存在冲突。
  • --no-ff是新建一个提交,然后将merger两个位置的下一次都指向这个新的提交。

如果条件满足时,merge 默认采用的 fast-forward 方式进行合并,除非你显示的加上 --no-ff 选项;而条件不满足时,merge 也是无法使用 fast-forward 合并成功的!

git rebase

正如前面介绍的, git rebase实际上也可以做类似的工作。git rebase可以将对应分支的基(即出发位置)合并到当前分支。(或者自己指定两个分支)。

例如:

1
2
3
// 假设当前在matser,且落后dev两个版本
$ git rebase dev
// 或者 git rebase master dev

则dev的指针指向了master的分支上,如下图:

rebase

stash

暂存一个不需要立即操作的文件树版本,将版本恢复到上一个commit。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 缓存一个版本
$ git stash push -m '第一个版本'

// 从stash列表中移除单个stash状态,并将其应用到当前工作树状态的顶部。当发生冲突的时候,该命令会失败,但该stash不会从stash列表中移除。此时可以手动解决冲突,然后使用git stash drop来移除。
$ git stash pop

// 使用一个stash状态,但不会将其从stash列表中移除
$ git stash appy

// 显示所有的stash记录
$ git stash list

// 展示在stash中的记录和当前文件内容的不同
$ git stash show

冲突处理

避免冲突

首先应当是避免冲突,每个人应该负责不同的模块,然后只修改对应的文件。过多的冲突应当是分工存在问题。

经常commit

减少冲突的另一个方面是经常push,将自己的代码提交到仓库,尽量避免一次提交过多的文件。其次应当保证commit的原子性,即一个commit只做一件事情。

写代码之前同步

在写代码之前,先pull一下,保证自己本地的代码已经同步了远程仓库,以减少可能发生的冲突。

手动处理

当前git已经很智能,只要存在冲突,就无法提交,或者merge。并且git会提示那些文件存在冲突,然后在文件中通过一定格式来标记,来让我们手动处理冲突。

例如:

1
2
3
4
5
6
士大夫第卅方4时5撒发射点发生
<<<<<<< HEAD
发士大夫的-这是另外的冲突
=======
发士大夫的-deawdaewea冲突
>>>>>>> dev
  • <<<||| 显示的是当前 master 分支上修改后的内容
  • |||---- 向您显示 master 分支与 dev 分支修改前共同的内容是什么
  • --->>> 显示的是 dev 分支上修改后的内容,也就是要合并分支的内容
  • =======用于分割不同的冲突点。

此时我们只需要删除不需要的代码(包括git的提示信息),然后将修改添加到暂存区,并进行提交更改。

最后再次进行提交或合并即可。

Powered by Hexo and Hexo-theme-hiker

Copyright © 2019 - 2024 My Wonderland All Rights Reserved.

UV : | PV :