携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
git本身含有很多操作,且有一些操作比较复杂,但平时我们可能只用到了add、commit、push。一旦遇到较为复杂的场景就不会了,但短时间又不好去系统的学习git,此时就可以适当的学习一些更多得到场景,而不只是老三样。以应对更加复杂的场景。
常见场景
暂存区
确认暂存区
// 增加所有文件到暂存区
$ git add .
// 增加指定文件到暂存区
$ git add [filename]
撤销暂存区
// 取消所有最新的暂存区文件
$ git reset HEAD .
// 取消缓存区最新的指定文件
$ git reset HEAD REAMDME.md
注意该命令的参数HEAD是要被恢复的版本, 一般选择HEAD, 即恢复到最新的HEAD。
下面撤销commit也使用该命令。
提交
确认提交
// 进行一次提交并附加消息'message'
$ git commit -m 'message'
撤销提交
git revet
git revert
进行一个新提交(commit)来恢复其他提交所做的更改。
$ git revert HEAD 撤销前一次 commit
$ git revert HEAD^ 撤销前前一次 commit
$ git revert commit (比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销也会作为一次提交进行保存。
git reset [version]
该命令会将头部指到指定的版本位置。
例如:
$ git reset HEAD^ # 回退所有内容到上一个版本
$ git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本
$ git reset 052e # 回退到指定版本
--hard会强制删除之前所有的信息提交. 慎用.
例如
$ 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
命令
修改错误的提交
这种情况可能是提交的文件错误或者message写错了.
此时可以使用 git commit --amend
来修改.
$ git commit --amend
接下来会弹出文本编辑器来修改对应信息, 不同系统不同,可以设置.
其信息大致如下:
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
命令.
格式:
$ git checkout <SHA-1>
$ git checkout HEAD[^/~<num>/^<num>]
$ git checkout 分支[^/~<num>/^<num>]
示例
$ git checkout ea321 // 切换到ea321版本
$ git checkout HEAD^ // 切换到上一个HEAD位置
$ git checkout develop~3 // 切换到develop分支的前三个分支上
提交合并
使用git rebase
命令可以合并commit.
格式
$ git rebase -i [startpoint] [endpoint]
[startpoint]
[endpoint]
则指定了一个编辑区间,如果不指定[endpoint]
,则该区间的终点默认是当前分支HEAD
所指向的commit
(注:该区间指定的是一个前开后闭的区间)。
比如:
// 效果一致
$ git rebase -i HEAD HEAD~3
$ git rebase -i HEAD~3
然后会弹出编辑器.
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上.
使用以下命令:
$ git rebase [startpoint] [endpoint] --onto [branchName]
例如:
$ git rebase ab123 ab124 --onto master
$ git rebase HEAD~3 --onto master
远程仓库同步
设置远程仓库
可以通过git remote
或者通过git branch
命令来配置远程仓库。
格式
$ git remote add [name] [url]
$ git branch --set-upstream-to = <upstream>
例如
// 新增远程仓库
$ git remote add dev https://github.com/vuejs/core.git
// 为当前分支增加上游
$ git branch --set-upstream-to = https://github.com/vuejs/core.git
确认推送
使用git push
命令可以使用本地引用更新远程引用,同时发送完成给定引用所必需的对象。
例如
// 如果配置了远程仓库,则直接git push
$ git push
// 将匹配得分支推送到远程的origin仓库
$ git push origin
// 将匹配得分支推送到远程的origin仓库master分支
$ git push origin master
撤销推送
- 本地回退版本
先使用git reset
回退版本
$ git reset --soft aa909cff2239536df14820fe086d96305b24e9f1
- 通过强制push,将旧版本推送到远程仓库
$ git push origin master --force
注意必须添加--force
,因为版本是落后的。
分支
新增分支
示例
// 切换到newBranch分支,如果不存在则创建后再求切换
$ git branch newBranch
// 切换到newBranch分支,如果不存在则创建后再求切换
$ git checkout newBranch
branch
,switch
命令本就是为了减轻checkout
命令而生,所以方法基本一致。
删除分支
同样的可以使用git branch
来删除分支。
// 删除本地分支
$ git branch -d dev1
// 删除一个正打开的分支
$ git branch -D dev1
恢复分支
格式
git branch <branch_name> <hash_val>
示例
git branch dev1 123d
Git会自行负责分支的管理,所以当我们删除一个分支时,Git只是删除了指向相关提交的指针,但该提交对象依然会留在版本库中。
因此,如果我们知道删除分支时的散列值,就可以将某个删除的分支恢复过来。在已知提交的散列值的情况下恢复某个分支。
可以通过查看本地文件的log文件或者reflog
命令来查找。
合并分支
git merge
通过git merge
命令,可以将分支合并到一起。
例如
// 假设当前在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
可以将对应分支的基(即出发位置)合并到当前分支。(或者自己指定两个分支)。
例如:
// 假设当前在matser,且落后dev两个版本
$ git rebase dev
// 或者 git rebase master dev
则dev的指针指向了master的分支上,如下图:
stash
暂存一个不需要立即操作的文件树版本,将版本恢复到上一个commit。
示例
// 缓存一个版本
$ 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会提示那些文件存在冲突,然后在文件中通过一定格式来标记,来让我们手动处理冲突。
例如:
士大夫第卅方4时5撒发射点发生
<<<<<<< HEAD
发士大夫的-这是另外的冲突
=======
发士大夫的-deawdaewea冲突
>>>>>>> dev
<<<
到|||
显示的是当前 master 分支上修改后的内容|||
到----
向您显示 master 分支与 dev 分支修改前共同的内容是什么---
到>>>
显示的是 dev 分支上修改后的内容,也就是要合并分支的内容=======
用于分割不同的冲突点。
此时我们只需要删除不需要的代码(包括git的提示信息),然后将修改添加到暂存区,并进行提交更改。
最后再次进行提交或合并即可。