基础搜索

匹配仓库标题、描述、README文件中的关键词

  • shop 🔍

进阶搜索

指定关键词所在位置

  • shop in:name 🔍
  • shop in:description 🔍
  • shop in:readme 🔍

指定stars数量范围

  • shop stars:>2000 🔍
  • shop stars:<3000 🔍

指定forks数量

  • shop forks:>3000 🔍
  • shop forks:<5000 🔍

指定仓库主要语言

  • shop stars:>3000 language:java 🔍
  • shop stars:>3000 language:python 🔍

高亮代码块搜索

仓库中按照文件名搜索

  • 按下T进入搜索
    • image-20220818133942773

二、代码回退

已提交没有push

git reset --soft 版本号	(撤销commit)
git reset --mixed 版本号	(撤销commit和add两个动作)

已push

git reset --hard 版本号	(撤销并舍弃指定版本号之后的提交记录)(慎用)

本地使用后需要强制推送到远程同步下,因为本地分支没有远程新了

git push origin master -f
git pull 远程主机(config文件中查看) (远程分支) -f
image-20220818145200454
git revert 版本号			(撤销,但是保留了提交记录)(推荐使用)

可能会提示冲突

git revert --abort	(取消恢复再次执行试试)
image-20220818145228472

三、冲突处理

一个远程代码库的一个分支由多人协作时的场景

用户A推送了代码,用户B再推送代码时会报错,提示远程代码库已被修改,这时需要拉取远程代码到本地后再次推送

前提是本地代码已commit

git pull origin master
git pull 远程主机(config文件中查看) (远程分支)
git push origin master
git pull 远程主机(config文件中查看) (远程分支)

拉取不相关代码时报错:

git pull origin master

git pull 失败 ,提示:fatal: refusing to merge unrelated histories

其实这个问题是因为 两个 根本不相干的 git 库, 一个是本地库, 一个是远端库, 然后本地要去推送到远端, 远端觉得这个本地库跟自己不相干, 所以告知无法合并

具体的方法, 一个种方法: 从远端库拉下来代码 , 本地要加入的代码放到远端库下载到本地的库, 然后提交上去 , 因为这样的话, 你基于的库就是远端的库, 这是一次update

第二种方法:使用这个强制的方法

git pull origin master --allow-unrelated-histories

后面加上 --allow-unrelated-histories , 把两段不相干的 分支进行强行合并,之后推送到远程的master分支:

git push origin master

git pull 失败,提示:fatal: Need to specify how to reconcile divergent branches...

分析:这是由于你拉取pull分支前,进行过merge合并更新分支操作,而其他人在你之前已经push过一个版本,导致版本不一致

  • 第一种解决方法:

执行git config pull.rebase false
默认将pull下来的代码与现有改动的代码进行合并
但是可能会造成代码冲突,需要处理下这个问题,代码冲突如果2个人都改了同一个文件,需要联系之前push的同学,看看这块代码怎么保存

  • 第二种解决方法:回退到合并之前的代码,在进行pull拉取最新代码

注意:这种解决方法仅适用于2个分支之间的合并(git merge)操作,比如你是将dev开发分支合并到test分支之前没pull,那这时候test分支需要回退到未合并前的版本。
test上合并上去的代码将会丢失,等你test分支能成功pull后,需要重新合并(merge)开发分支dev上的代码合并到test上。所以记得保留dev开发分支这个版本的代码再把test回退到上一个版本,等pull成功,再重新在test分支上合并dev分支代码

四、多分支操作

git多分支开发常用命令

git branch 列出所有本地分支
git branch -r 列出所有远程分支
git branch -a 列出所有分支
git branch name 新建一个分支,但仍停留在当前分支
git checkout -b [branch] 新建一个分支并切换到该分支
git checkout name 切换到指定分支
git checkout - 切换到上一个分支
git merge [branch] 合并指定分支到当前分支
git branch -d [name] 删除指定的本地分支
git push origin --delete name 删除指定远程分支
git push origin name 把本地分支上传到远程
git checkout -b 本地分支名x origin/远程分支名x

每个分支拥有独立的代码空间

切换分支其他命令 git switch [分支名]

当想从子分支切换到dev分支时git checkout dev
报错:
error: you need to resolve your current index first
xxx.java: needs merge
xxx.xml: needs merge

解决办法一:git reset --merge

  • git reset --merge是一种新的模式,其工作方式类似于git checkout交换机分支的方式 ,在切换到另一个提交时进行本地更改.
  • 回退到merge之前

解决办法二:进行add commit操作

然后再次git checkout dev

⚠️执行了stash相关操作后,切换分支之前需要将当前分支未添加到工作区或暂存区的代码作添加或隐藏操作

否则报错:

error: Your local changes to the following files would be overwritten by checkout:
     src/main/java/com/qiandao/juc/stash.java
Please commit your changes or stash them before you switch branches.

五、git stash操作

原文链接:https://blog.csdn.net/stone_yw/article/details/80795669

应用场景:

1 当正在dev分支上开发某个项目,这时项目中出现一个bug,需要紧急修复,但是正在开发的内容只是完成一半,还不想提交,这时可以用git stash命令将修改的内容保存至堆栈区,然后顺利切换到hotfix分支进行bug修复,修复完成后,再次切回到dev分支,从堆栈中恢复刚刚保存的内容。
2 由于疏忽,本应该在dev分支开发的内容,却在master上进行了开发,需要重新切回到dev分支上进行开发,可以用git stash将内容保存至堆栈中,切回到dev分支后,再次恢复内容即可。
总的来说,git stash命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容。这也就是说,stash中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。git stash作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中。

1. git stash

能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录。

2. git stash save

作用等同于git stash,区别是可以加一些注释,如下:
git stash的效果:

stash@{0}: WIP on master: b2f489c second

git stash save “test1”的效果:

stash@{0}: On master: test1

3. git stash list

查看当前stash中的内容

4. git stash pop

将当前stash中的内容弹出,并应用到当前分支对应的工作目录上。
注:该命令将堆栈中最近保存的内容删除(栈是先进后出)
顺序执行git stash save “test1”和git stash save “test2”命令,效果如下:

$ git stash list
stash@{0}: On master: test2
stash@{1}: On master: test1

$ git stash pop
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   src/main/java/com/wy/StringTest.java

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (afc530377eacd4e80552d7ab1dad7234edf0145d)

$ git stash list
stash@{0}: On master: test1

可见,test2的stash是首先pop出来的。
如果从stash中恢复的内容和当前目录中的内容发生了冲突,也就是说,恢复的内容和当前目录修改了同一行的数据,那么会提示报错,需要解决冲突,可以通过创建新的分支来解决冲突。

5. git stash apply

将堆栈中的内容应用到当前目录,不同于git stash pop,该命令不会将内容从堆栈中删除,也就说该命令能够将堆栈的内容多次应用到工作目录中,适应于多个分支的情况。

$ git stash apply
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   src/main/java/com/wy/StringTest.java

no changes added to commit (use "git add" and/or "git commit -a")

$ git stash list
stash@{0}: On master: test2
stash@{1}: On master: test1

堆栈中的内容并没有删除。
可以使用git stash apply + stash名字(如stash@{1})指定恢复哪个stash到当前的工作目录。

6. git stash drop + 名称

从堆栈中移除某个指定的stash

7. git stash clear

清除堆栈中的所有内容

8. git stash show

查看堆栈中最新保存的stash和当前目录的差异。

$ git stash show
 src/main/java/com/wy/StringTest.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

git stash show stash@{1}查看指定的stash和当前目录差异。
通过 git stash show -p 查看详细的不同:

同样,通过git stash show stash@{1} -p查看指定的stash的差异内容。

9. git stash branch

从最新的stash创建分支。
应用场景:当储藏了部分工作,暂时不去理会,继续在当前分支进行开发,后续想将stash中的内容恢复到当前工作目录时,如果是针对同一个文件的修改(即便不是同行数据),那么可能会发生冲突,恢复失败,这里通过创建新的分支来解决。可以用于解决stash中的内容和当前目录的内容发生冲突的情景。 发生冲突时,需手动解决冲突。

六、代码合并

rebase

融合多次commit提交,效果:

image-20220818184835076
  • 命令行
git rebase -i HEAD~~~
或者git rebase -i HEAD~3
  • 回车后修改如下合并信息
image-20220818185241951
  • 保存退出后更改提交注释
image-20220818185338192

变基合并代码

master上有一个新提交M,feature上有两个新提交C和D

image-20220818201352100

此时切换到feature分支上,执行如下命令,相当于是想要把master分支合并到feature分支(这一步的场景就可以类比为我们在自己的分支feature上开发了一段时间了,准备从主干master上拉一下最新改动)

git checkout feature
git rebase master

//这两条命令等价于git rebase master feature

下图为变基后的提交节点图,解释一下其工作原理:

image-20220818201442372
  • feature:待变基分支、当前分支
  • master:基分支、目标分支

实际操作

将test02分支上push的代码合并到dev上:

  • 切换到test02分支
  git switch test02
  • 将dev分支变基到当前test02分支
  git rebase dev
  • 再切换到dev分支
git switch dev
  • 合并test02分支到当前dev分支
git merge test02
  • 合并后的效果很干净,一条直线
image-20220818202906925

merge

合并其他分支到当前分支

  • 切换到当前dev分支
git checkout dev
  • 合并test分支内容到当前dev分支
git merge test
  • 如果代码存在冲突,比如修改了同一行代码需要手动解决
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
  • 解决之后再次在当前dev分支提交代码
git add .
git commit -m "merge合并"
git push origin dev
  • 可以看到提交记录已完成合并
image-20220818193649647

七、标签操作

1. 创建标签

直接创建:git tag <name>
创建带备注的标签:git tag -a <name> commitID -m <"message">
---
 git tag v1.0
 git tag v2.0

2. 标签同步至远程服务器

指定标签:git push origin <name>
所有标签:git push origin --tags
---
 git push origin v1.0
 git push origin v2.0

3. 删除本地标签

git tag -d <name>
---
git tag -d v1.0

4. 删除远程标签

git push origin :refs/tags/<name>
---
git push origin :refs/tags/v1.0

5. 查看标签

git show