git版本管理:分支合并常用命令

常用命令

git clone <repo-url> # 拷贝项目到本地
git branch <new-branch> # 创建新分支
git checkout <new-branch> # 切换到新分支
git checkout -b <new-branch> # 创建并切换到新分支

git fetch <repo-name> <branch-01> # 从远程获取repo
git pull <repo-name> <remote-branch>:<local-branch> # 获取远程remote分支,合并到本地local分支
git pull # 获取并合并到本地当前分支

git add . # 添加全部改动
git commit -m "msg" # 提交当前分支到本地
git push <repo-name> <local-branch>:<remote-branch> # 提交本地更改到远程
git push origin <new-branch># 提交新的本地分支,这里的origin就是默认的<repo-name>

git checkout main # 切换回主分支
git merge <new-branch> # 合并其他分支<new-branch>到main
git branch -d <old-branch> # 删除已经用完的分支<old-branch> 

git reset --hard origin/master # 直接用fetch的线上版本覆盖本地分支
git reset HEAD # 回退到上一版本
git restore --staged readme.md 
git checkout -- readme.md

常用命令在这里:https://www.runoob.com/git/git-basic-operations.html

fetch and remote

全部来自这个知乎专栏:杨世伟

远程repo

git remote -v(这个命令没什么用)

默认执行git remote命令后会列出之前设置过的所有远端仓库的别名

$ git remote

展示当前关联的其他仓库列表

$ git remote -v

与上面的命令一样,但是输出会包含每一个仓库的URL.

$ git remote add <repo-name> <repo-url>

上面的命令创建了一个与远端仓库的关联关系。在此之后,你就可以使用作为这个仓库的别名在其他git命令中使用。

$ git remote rm <name>

删除别名为的远端仓库的关联关系。

$ git remote rename <old-name> <new-name>

将别名为< old-name>的远端仓库的关联关系重命名为< new-name>。

HTTP 还是 SSH

Git支持通过很多方式来访问远端仓库。其中最简单的两种方式是通过HTTP和SSH协议。HTTP协议通常用于允许匿名只读访问仓库。比如:

http://host/path/to/repo.git

但是,通常来说通过HTTP地址的访问都无法进行push操作(应该不会有人愿意让匿名用户进行push操作)。对于可读可写的操作,应该使用SSH协议

ssh://user@host/path/to/repo.git

通过SSH协议访问时,Git托管主机上应该有你的一个合法SSH账号,除此之外你无需进行其他任何配置,Git的具名SSH访问能力是开箱即用的。通常第三方托管平台,会提供你的Git项目的URL。

SSH如何使用

实测还是ssh好用

一旦生成ssh key之后就不用像https一样每次都输入临时密码了。

下面这篇笔记讲了如何使用SSH key :
印象笔记——dev.azure uses SSH key to git clone

git pull=git fetch+git merge

git fetch

git pullgit fetch 这两个命令都可以用于下载远端仓库。你可以认为git fetch是这两者中更加安全的那个,即便下载了远端的内容,但也不会更新你本地仓库的版本状态,以保证你本地当前代码完好无损。反观git pull命令则是一个更加激进的命令,它会下载当前正在工作的分支对应的远端内容,并且在下载成功之后马上执行一个git merge命令,为新下载下来的远端内容创建一次merge commit。此时如果你有正在进行中的工作还没准备好进行合并,这些行为可能会造成代码冲突,然后马上进入合并代码过程中解决冲突的流程。

获取远程分支1

以下来自 知乎专栏——同步GIT仓库的操作 – fetch命令

git fetch <remote>

Fetch仓库中所有分支。同时也会下载指定远端的所有commits和文件。

git fetch <remote> <branch>

与上面的命令同样,但只会fetch指定分支。

git fetch --all

fetch所有已注册过的远端仓库的全部分支。

获取远程分支2

以下来自 菜鸟教程——git fetch 命令

假设你配置好了一个远程仓库,并且你想要提取更新的数据,你可以首先执行:

git fetch [alias]

以上命令告诉 Git 去获取它有你没有的数据,然后你可以执行:

git merge [alias]/[branch]

以上命令将服务器上的任何更新(假设有人这时候推送到服务器了)合并到你的当前分支。

git pull origin remote-branch01:local-branch01

将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。

$ git pull origin master:brantest

如果远程分支是与当前分支合并,则冒号后面的部分可以省略。

$ git pull origin master

上面命令表示,取回 origin/master 分支,再与本地的 brantest 分支合并。

$ git pull origin new-branch

branch and merge

使用分支

git branch命令允许对分支进行创建、列举、重命名以及删除的操作。它不能进行切换分支或者将分叉的commit记录扔到其他分支里。因此git branch总是与git checkout以及git merge命令共同出现在使用场景中。

$ git branch <branch-name>

创建一个名为 的分支。但此命令并不会自动检出新创建的分支。

$ git branch -d <branch-name>

删除指定分支。这是一个安全的操作,因为当分支中含有未合并的变更时,Git会阻止这一次删除操作。

$ git branch -m <branch-name>

对于当前分支重命名为。

本地创建并使用分支

$ git branch branch01 # 创建新分支
$ git checkout branch01 # 选择所创建的分支

查看一下现在的分支状态:

$ git branch
    * branch01 
      master
      release

星号(*)表示当前所在分支。现在的状态是成功创建的新的分支并且已经切换到新分支上。创建并选择分支合并为一句:

git checkout -b branch01 

要注意此时你只是创建了这个分支。如需开始对新分支进行提交,要先选择这个新的分支,使用git checkout命令,然后再使用标准流程git addgit commit等命令。
本地分支与远端的联系尽量一致,如果本地相较于远程多出来的,可以删除。
$ git remote rm branch01

过程如下:

$ git checkout branch01
	M	README.md
	切换到分支 'branch01'
$ git add .
$ git commit -m "git branch"
	[branch01 9296183] git branch
	 1 file changed, 3 insertions(+), 1 deletion(-)
$ git push
	fatal: 当前分支 branch01 没有对应的上游分支。
为推送当前分支并建立与远程上游的跟踪,使用    git push --set-upstream origin branch01

可以发现当本地新建分支并要推送的时候,必须要选择是推送哪个分支。

将本地branch提交

$ git push <remote-repo-name> local-new-branch:remote-new-branch# 当地新分支提交到remote origin的新分支

以上命令先添加了远程仓库,然后将本地分支branch01推向远程,如果仓库里没有这一分支,就创建同名的分支。

实际情况没有这么复杂。假如我们实在一个repo上改动,那是不变的,也就是origin。远程分支与本地分支同名

$ git push origin branch01 # 当地分支提交到远程仓库

使用
git branch -a
查看所有分支,会看到
remotes/origin/dbg_lichen_star
这个远程分支,说明新建远程分支成功。

删除远程分支

我比较喜欢的简单方式,推送一个空分支到远程分支,其实就相当于删除远程分支:

$ git push origin :dbg_lichen_star

也可以使用:

$ git push origin --delete dbg_lichen_star

CSDN博客「-FIGHTING-」

合并

merge

如果要合并到main分支,是这样做的

$ git checkout main
$ git merge branch01
$ git push -u origin main

用带参数的git log也可以看到分支的合并情况

$ git log --graph --pretty=oneline --abbrev-commit

知乎 专栏 - Git——如何解决 Git 中的合并冲突?

git reset 强制覆盖本地代码

由于new-branch是在Azure网站上在线更改的,没有本地备份,因此在fetch整个

git强制覆盖:

$ git fetch --all # 拉取所有更新,不同步
$ git reset --hard origin/master # 直接用线上版本覆盖本地分支
$ git pull # 再更新一次

第一个是:拉取所有更新,不同步;

第二个是:本地代码同步线上最新版本(会覆盖本地所有与远程仓库上同名的文件);

第三个是:再更新一次(其实也可以不用,第二步命令做过了其实)

原文链接:【git】强制覆盖本地代码(与git远程仓库保持一致)

全部恢复至某个历史版本

git reset --hard 历史版本号b1c
git push -f origin master # 强制推送

撤回更改

舍弃更改

遇到切换分支时,报错“请在切换分支/合并前提交或贮藏您的修改”,或“尚未暂存以备提交的变更”,那就是:修改了此文件并且没有add和commit.然后你在branch、pull时就会出现此提示。参考:git pull时:对下列文件的本地修改将被合并操作覆盖

$ git restore --staged README.md
$ git checkout -- README.md

执行commit后,还没执行push时,想要撤销这次的commit,该怎么办?

git reset --soft HEAD^

这样就成功撤销了commit,如果想要连着add也撤销的话,–soft改为–hard(删除工作空间的改动代码)。

另外一点,如果commit注释写错了,先要改一下注释,有其他方法也能实现,如:

git commit --amend

这时候会进入vim编辑器,修改完成你要的注释后保存即可。

git 各类撤销命令

1.git add 后撤销:

撤销所有add文件

git reset HEAD .

撤销单个add文件

git reset HEAD -filename

2.git commit 后撤销:

只回退commit的信息,保留修改代码:

git reset --soft head

彻底回退到上次commit版本,不保留修改代码:

git reset --hard head^

说明:
HEAD :当前版本
HEAD^ :上一个版本
–hard 参数会抛弃当前工作区的修改
–soft 参数的话会回退到之前的版本,但是保留当前工作区的修改,可以重新提交

3.撤销所有本地改动代码:

git checkout .

4.本地代码回退到与git远程仓库保持一致

git reset --hard 远程分支名

5.git push撤销:

回滚此次push到服务器的代码:

git log #查看commit的信息
git revert 以前commit的id

此时本地回滚的代码到服务器就可以了

6.git merge 撤销:

git checkout 【行merge操作时所在的分支】
git reset --hard 【merge前的版本号】

查看本地与remote的异同

命令 作用
git diff 工作区 vs 暂存区
git diff head 工作区 vs 版本库
git diff --cached 暂存区 vs 版本库

CSDN-DRPrincess博客: Git三大特色之Stage(暂存区)

submodule

自己的项目添加子模块

git submodule add <url> path # 增加子模块

拷贝的项目带有子模块需要进入目录更新

别人写的项目如果有子项目,使用者git clone只能获取他的主程序,而没有这些submodule。如果git clone <repo-url> --recursive仍然不能获取到所有内容。可以尝试

git submodule update # 如果子模块目录下是空的,这样来更新
subpath/ $ git pull # 也可以直接进入子模块目录获取这些

当使用git clone下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的,文件夹是空的。此时,只需执行如下命令:

git submodule init
git submodule update
# 或:
git submodule update --init --recursive

完整拷贝带有子模块的项目

git pull --recurse-submodules # update recursively all the submodules

ref

  1. 杨世伟的知乎专栏
  2. 知乎专栏——同步GIT仓库的操作 – fetch命令
  3. 知乎专栏——Git——如何解决 Git 中的合并冲突?
  4. 印象笔记——dev.azure uses SSH key to git clone
  5. 菜鸟教程——git 常用命令
  6. 菜鸟教程——git fetch 命令
  7. CSDN博客——【git】强制覆盖本地代码(与git远程仓库保持一致)
  8. CSDN博客——git pull时:对下列文件的本地修改将被合并操作覆盖
  9. CSDN博客——git commit后,如何撤销commit
  10. CSDN博客——git操作—克隆含有子模块的项目

猜你喜欢

转载自blog.csdn.net/NICAI001/article/details/127823205