当前位置:   article > 正文

【git】git常用操作--克隆/提交/合并/撤回/修改分支名/同步多个远程库_merge locally

merge locally

参考教程

推荐一个在线学习工具,是GitCode的一个教程
https://codechina_dev.gitcode.host/learn-git-branching/?locale=zh_CN

还有沙盒可以练习:
https://codechina_dev.gitcode.host/learn-git-branching/?NODEMO=&locale=zh_CN

笔者的一些学习笔记
https://gitcode.net/sinat_32872729/git-learning-course/-/tree/master/02.Git_online

git常用命令

如何克隆仓库?

① 克隆一个仓库:clone

git clone <仓库地址>
# 例: 
git clone http://xxx/yyy.git
cd yyy  # 进入仓库yyy
git branch  # 查看分支,默认是只有master分支
  • 1
  • 2
  • 3
  • 4
  • 5

默认克隆的master分支,如果克隆一个非master分支,加上-b <分支名>

git clone -b <分支名> <仓库地址>
# 例:克隆一个仓库的dev分支
git clone -b dev http://xxx/yyy.git
cd yyy  # 进入仓库yyy
git branch  # 查看分支,默认是只有dev分支
  • 1
  • 2
  • 3
  • 4
  • 5

如何新建分支/提交修改/推送/合并?

② 建立新的分支:checkout -b

git checkout -b devx <分支名>  # 基于某分支<分支名>建立分支newdev,并切换到devx分支
# 例:基于master分支建立新分支dev1,并切换到dev1分支
git checkout -b dev1 master
# 例:基于dev分支建立新分支 dev2,并切换到dev2分支
git checkout -b dev2 dev
  • 1
  • 2
  • 3
  • 4
  • 5

切换分支:checkout

git checkout <分支名>
# 例:切换到master分支
git checkout master
# 例:切换到devx分支
git checkout devx
  • 1
  • 2
  • 3
  • 4
  • 5

③ 对仓库中的文件修改后,将文件添加到暂存区:add

git add <文件名><目录>  # 可直接添加文件或目录
# 例:
git add /yourdir/changedFile.txt
git add /changedDir/file1.txt
# 或:
git add .  # 添加当前目录所有变更,使用相对路径
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

add添加后,使用commit将暂存区内容添加到本地仓库中:(加-m对本次提交进行简要说明)

git commit -m "your change info"
# 例:
git commit -m "fix bug"
  • 1
  • 2
  • 3

④ 将本地的分支推送到远程:push

git push origin <分支名>
# 例:
git push origin devx
  • 1
  • 2
  • 3

⑤ 将分支与master合并:merge

# 合并前,切换到master分支:
git checkout master
# 如果多人开发,切换后,应该从远程pull下master分支:git pull origin master
# 合并分支:弹除编辑文件框,编写本次合并说明
git merge --no-ff devx # 将<devx>分支合并到master,编辑合并日志之后":wq"保存
# 合并到master后,推送master
git push origin master
# 注意再从master切换会开发分支
git checkout devx
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

如何忽略特定文件?

git管理时希望忽略一些文件,按如下步骤:

  1. 直接在git根目录下创建文件.gitignore,编辑要忽略的文件:

    .gitignore
    *.log
    *.pyc
    abc.e
    c/d/x.txt
    
    • 1
    • 2
    • 3
    • 4
    • 5

    上面示例中忽略文件:文件.gitignore、以log后缀的文件*.log、以txt后缀的文件*.pyc和指定文件abc.e、指定路径下的文件c/d/x.txt

  2. 删除要忽略的文件:

    git rm --cached <file>  # 删除缓存中要忽略的文件
    
    • 1
  3. 提交说明该忽略操作:

    git commit -m "rm and ignore xxx"
    
    • 1

如何撤回提交?

⑥ 撤回 reset
https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%92%A4%E6%B6%88%E6%93%8D%E4%BD%9C

  1. 上一步add了一些文件(但是没有commit提交),撤回使用:

    git reset HEAD <要撤回的文件路径>  # add后,撤回指定文件
    git reset HEAD  # add的所有文件都想撤回,后面不加文件即可:即撤回上一步add的所有文件
    
    • 1
    • 2

    例如:使用了如下命令

    git add <myfile1> <myfile2>  # 添加了两个文件
    git reset HEAD <myfile1>  # 撤回添加myfile1
    git reset HEAD  # 直接撤回添加的所有文件
    git status  # 查看提交文件已撤回
    
    • 1
    • 2
    • 3
    • 4
  2. add后使用commit提交了文件(但是没有push推送),就是上一步commit了一些文件:

    • 撤销提交并撤销add的所有文件
      git reset --soft HEAD^  # 撤回上一步提交
      git reset HEAD  # 撤回添加的所有文件
      
      • 1
      • 2
    • 只是修改commit提交说明,示例操作:
      git add <file1>
      git commit -m "add file"
      git reset --soft HEAD^   # 撤回上一步提交 
      git commit -m "add new file"   # 重新修改说明再提交
      
      • 1
      • 2
      • 3
      • 4
    • 如果commit的说明不变,只是少添加了一个文件或文件有小的变动,不想多次提交:
      git add <file1> <file1> <file3>   # 一开始提交的文件(比如,file4忘记提交,或file3有小变动
      git commit -m 'initial commit'   # commit提交了
      git add <file4>   # 发现file4没有提交,但是不想再撤回commit,直接add要增加提交的文件
      git commit --amend   # 提交增加的文件后,使用`-amend`命令即可(会弹出文本,确认是否重新编辑刚才提交的commit)
      
      • 1
      • 2
      • 3
      • 4
  3. 如果 add, commit后,还推送push到了远程仓库,如何退回?【谨慎操作】
    files还需要的话请备份!因为是使用强制退回,回删除要退回处之后的提交!

    # 示例已进行的操作:
    git add <files>
    git commit "add files"
    git push origin dev1  # 推送到了dev1远程开发分支
    # 此时向退回到没有添加 <files> 的操作
    
    # files还需要的话请先备份!因为是使用强制退回,回删除要退回处之后的提交!
    
    # 先找要退回对应的提交号
    git log  # 对应退回commit后的值, 取几位即可, 比如是 abcdefg
    
    # 强制撤销变更到指定提交【谨慎操作】
    git reset --hard abcdefg
    
    # 强制推送【谨慎操作】
    git push origin master --force 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

如果是从远程git pull拉取后向撤回,使用git reset --hard <提交号>撤回到指定<提交号>对应版本。(操作时注意确认是否备份修改)

参考:
  • 1

在这里插入图片描述


待整理:合并后如何退回?

Check out, review, and merge locally
Step 1. Fetch and check out the branch for this merge request
git fetch origin
git checkout -b devx origin/devx
Step 2. Review the changes locally
Step 3. Merge the branch and fix any conflicts that come up
git fetch origin
git checkout origin/master
git merge --no-ff devx
Step 4. Push the result of the merge to GitLab
git push origin master
Tip: You can also checkout merge requests locally by following these guidelines.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

如何撤回修改?

当本地进行了一些修改,发现修改错误,想返回到没有修改的时候。也就是想撤回到与最近一次提交相同的状态。请注意,这个撤回表示放弃当前本地修改,请谨慎操作!!

git checkout -- <file>  # 指定将`file`撤回到与最近一次提交相同
  • 1

如果所有本地修改的文件都撤回本地修改,还可以直接:用git checkout后加点.当前目录下,请慎用

git checkout .
  • 1

关于git中,所有不熟悉的修改、删除、撤回等变更操作,都应该先测试或在熟悉的情况下,再操作具体命令!!!

如果有一种情况是,并不是想真正的撤回到最近一次提交,而是先回到最近一次提交,执行一些操作后,再继续当前的修改。

比如一个任务场景是:有一个开发需要(1)一周才能完成,第2天修改的中途,发现有另一个需求(2)需要快速完成,但(2)只是基于最近一次提交的变更。

使用stash命令:

  1. 暂时存放当前对需求(1)的修改(现场):

    git stash save "一些相关描述"
    
    • 1

    对进行到一半的对需求(1)的修改暂时保存,这时当前工作区会恢复到最近一次提交状态。可以对需求(2)继续修改、提交、推送等。

  2. 完成需求(2)后,将刚才暂存的数据再还原:

    git stash pop
    
    • 1

如何添加/删除标签?

如何打标签? tag

git log --pretty=oneline  # 查看commit id
git tag -a v1.0 d32a97d  # 取commit id一部分打标签(Enter后,弹出注释信息:initial version v1.0)
git push origin v1.0  # 推送指定版本标签到所有分支仓库
# git push origin --tags  # 推送所有标签

# 克隆指定标签版本:
git clone -b v1.0 http://xxx/yyy.git
# git tag -a v1.0 -m 'version 1.0'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

删除标签:

# 比如已经有了v1.0版本标签
# 先删除 v1.0
git tag -d v1.0
# 再推送
git push origin :refs/tags/v1.0
  • 1
  • 2
  • 3
  • 4
  • 5

如何同时修改本地和远程的分支名称?

先本地修改分支名称:

# 若在当前分支上,使用如下命令修改分支
git branch -m <new-branch-name>
# 若在其他分支上,使用如下命令修改分支
git branch -m <old-branch-name> <new-branch-name>
  • 1
  • 2
  • 3
  • 4

然后删除远程旧分支名称:

git push origin --delete <old-branch-name>
  • 1

最后再推送新分支名称;

git push origin <new-branch-name>
  • 1

如何同步两个远程库?

来自chatGPT回答

要同步两个远程库,可以使用以下步骤:

  1. 首先,确保你具有访问两个远程库的权限。

  2. 进入你的本地代码仓库,并添加第二个远程库作为一个新的远程仓库。假设第一个远程库名为 origin,第二个远程库名为 second,你可以使用以下命令添加第二个远程库:

    git remote add second <URL of second remote repository>
    
    • 1
  3. 执行 git fetch 命令来从两个远程库中获取最新的变更:

    git fetch origin
    git fetch second
    
    • 1
    • 2

    这将拉取每个远程库中的最新提交和分支信息,但不会合并到本地分支。

  4. 查看分支信息以确保两个远程库都被成功获取:

    git branch -a
    
    • 1

    这将显示本地分支和远程分支列表。

  5. 如果你想将第二个远程库的更改合并到你的本地分支,可以执行合并操作。比如,假设要将 second/main 分支合并到本地的 main 分支:

    git merge second/master  # 注意:可能有冲突!!!
    
    • 1

    或者你也可以选择使用 rebase 将第二个远程库的提交放在你的本地提交之前:

    git rebase second/master
    
    • 1

    请根据你的项目需求选择适合的合并策略。

  6. 最后,将本地更改推送到第一个远程库(origin):

    git push origin master
    
    • 1

    这将把合并后的更改推送到第一个远程库中。


注意:对于第5步合并时,可能出现冲突:fatal: refusing to merge unrelated histories。冲突是说,两个分支的历史没有共同的祖先导致的。可以进行强制合并,但是应注意可能导致的冲突和意外:

  1. 使用 --allow-unrelated-histories 选项强制合并两个不相关的分支历史。

    git merge --allow-unrelated-histories <branch-name>
    
    • 1
  2. 如果你只是想合并两个不相关的分支,并且不需要保留它们各自的历史记录,你可以创建一个新的空分支,并将其与两个不相关的分支合并。

    git checkout --orphan <new-branch-name>
    git commit -m "Merge unrelated branches"
    
    • 1
    • 2

当前笔者测试没有进行合并,只是想同步后期的提交更新。

如何删除关联的远程仓库?

当关联了多个远程仓库,想删除其中一个。执行命令:

git remote remove <remote_name>
# 比如关联时定义的名称是second
git remote remove second
  • 1
  • 2
  • 3

这里可以先使用git remote -v查看管理的远程仓库列表。

如何移动文件/文件夹,又如何撤回?

# 移动了文件夹
git mv old_file new_file # 移动或重命名文件(文件夹)
git status  # 此时查看移动的状态是renamed,如果直接移动则被认为是删除(deleted)了old_file,增加了new_file
  • 1
  • 2
  • 3

发现移动错误了文件,想撤回,跟一般添加文件后撤回相同:

git reset HEAD  # 撤回了上一步变更的所有文件,也可指定撤回文件:git reset HEAD filexxx
  • 1

但是,请注意,这个reset操作执行后并不会将你的文件撤回移动到原来的文件,相当于只是撤回了在Git缓存中的移动操作。本地还需要手动自己还原:

mv new_file old_file
  • 1

然后再重新移动操作。

可能是移动后又撤回了,然后又在电脑上手动移动了导致报错:
Another git process seems to be running in this repository, e.g.
an editor opened by ‘git commit’. Please make sure all processes
are terminated then try again. If it still fails, a git process
may have crashed in this repository earlier:
remove the file manually to continue.

意思大概是说,有进程正在运行被锁定了。不知道是什么进程影响(可能是我一边在win-Git下操作一边在电脑修改文件夹导致吧)。参考这个博客解决了,就是删除这个锁定文件即可:

rm -f .git/index.lock
  • 1

其他常用命令

git diff <file>  # 查看修改文件和暂存区的区别
git rm <file>  # 删除git add到暂存区的文件
git branch -d <dev>  # 删除dev分支

# 获取远程的所有分支
git fetch origin
git branch -a
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

一篇不错的git常用操作常见介绍:https://blog.csdn.net/xinzhifu1/article/details/123271097


更新中。。。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/478601
推荐阅读
相关标签
  

闽ICP备14008679号