Git配置版本控制与分支管理

Posted 林慢慢脑瓜子嗡嗡的

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git配置版本控制与分支管理相关的知识,希望对你有一定的参考价值。

文章目录

以前有些过渡依赖“小乌龟”,关于Git基本上只会pull、add、push、commit,其余的git操作用的一团糟,本篇博客结合实例记录下平时常用的git操作。

一、创建版本库

1. 配置git环境

  • git 安装好以后,需要配置环境变量,命令行中输入以下命令:
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
  • git config --list:查看当前的git配置;

  • 配置好环境后,使用命令 git init,即可将当前目录变成一个git可以管理的仓库;

  • git顺序:工作区 - - add - -> 暂存区 - - commit - -> 版本库 - - push - -> 远程版本库。

    1. 使用命令 git add <文件名>,将修改的文件添加到暂存区。
    2. 使用命令 git commit -m "提交信息",将暂存区的文件提交到版本库。
    3. 使用命令 git push 将本地版本库中的内容推送到远程版本库。

    请注意,流程中的步骤 1 和 2 也可以使用命令 git commit -a -m "提交信息" 来完成,这样就省略了步骤 1的git add

总的来说,使用 git 的流程就是先在本地仓库进行文件的修改和添加,然后使用 git add 将修改的文件添加到暂存区,最后使用 git commit 将修改的内容提交到本地版本库,最后使用 git push 将本地版本库中的内容推送到远程版本库。

二、时光机穿梭

1. 版本回退

  • git status:查看仓库的当前状态;
  • git diff:查看上次修改的内容;
  • git log:显示所有提交日志,可以增加--pretty=oneline参数减少输出,可以使用--graph --pretty=oneline --abbrev-commit参数使输出更加直观;
  • git reset --hard HEAD^:回退到上一版本,在git中,HEAD表示当前版本,HEAD^表示上一版本,HEAD^^表示上上版本,HEAD~10表示往前第10个版本;
  • git reset --hard <commit_id>:回退到指定的commit id版本,commit id可以不用输完整,输前几位就能找到;
  • git reflog:查看历史命令,可以用来找回commit id

记命令挺乏味的,下面结合一下具体项目里用到的流程讲解

  1. 使用 git log 查看历史提交记录,找到需要回退到的版本的 commit id
  2. 使用 git reset --hard <commit_id> 回退到指定的版本。注意,这个操作会把当前分支的指针直接移动到指定的版本,并且会丢弃当前分支中未提交的所有修改。如果你只是想撤销上次的提交,可以使用 git reset HEAD~ 命令,这样只会把未提交的修改撤销,而不会改变当前分支的指针。
  3. 如果你使用了 git reset --hard <commit_id> 命令将版本回退到了一个不正确的版本,或者因为某些原因你希望回到之前的版本,可以使用 git reflog 查看历史命令记录,然后找到你希望回到的版本的 commit id,再使用 git reset --hard <commit_id> 命令将版本回退到正确的版本。

注意, 一旦你使用了 git reset --hard 命令,之前的版本就会丢失,无法恢复。所以,在使用这个命令之前,一定要先备份重要的数据,以防万一。

2. 撤销修改

  • git restore <file_name>:撤销对(工作区)文件的修改;

  • git restore --staged <file_name>:撤销已经 git add 放到暂存区的文件;

  • git reset --hard HEAD^:撤销已经git commit到版本库的修改,即回退到上一版本。--hard表示之前的修改直接丢掉,--mixed(default)表示之前的修改保留在工作区,--soft表示之前的修改保留在暂存区。

    如果你使用的是 git reset --mixed HEAD^ 命令,会把之前的修改保留在工作区,而不会丢弃。你可以通过这个命令撤销已经提交到版本库的修改,但是保留在工作区,方便你继续修改。

3. 删除文件

  • git rm <file_name>:删除版本库中的文件,需要再使用git commit提交删除到版本库;
  • 若删除了工作区的文件,想从版本库中恢复到工作区,可以使用git restore <file_name>

如果你使用了 git rm <file_name> 命令删除文件,并提交到版本库,那么这个文件就真正的从版本库中删除,无法恢复。所以,在使用这个命令之前,一定要先备份重要的数据,以防万一。

三、分支管理

1. 创建与合并分支

分支名以“dev”为例。

  • git checkout -b dev-b参数表示创建并切换到dev分支,该命令同git switch -c dev
  • git merge dev:合并dev分支到当前分支;
  • git merge --on-ff dev:合并但禁用快速合并(推荐),因为dev分支上可能会有很多零碎的提交,这种方式能够避免搅乱master的提交历史;
  • git branch -d dev:删除dev分支,参数-D表示强制删除,用来删除还未合并的分支。

2. 解决冲突

  • 若合并时存在冲突,使用git status查看冲突文件;
  • 然后手动编辑文件解决冲突。

示例,在冲突文件中,你会看到以下内容:

<<<<<<< HEAD
这是当前分支的内容
||||||| merged common ancestors
这是在两个分支中都存在的内容
=======
这是另一个分支的内容
>>>>>>> 另一个分支的名字

在上面的内容中:

  • <<<<<<< HEAD======= 之间的内容是当前分支的内容。
  • ||||||| merged common ancestors 之间的内容是两个分支中都存在的内容。
  • =======>>>>>>> 另一个分支的名字 之间的内容是另一个分支的内容。

在解决冲突时,你需要删除上面的分割线和分支信息,并保留你希望在最终版本中保留的内容。例如:

这是我希望在最终版本中保留的内容

当你完成冲突解决之后,使用 git add <file_name> 命令将文件放到暂存区,然后使用 git commit 命令提交解决冲突的版本。需要注意的是,解决冲突时需要格外小心,因为如果误删除了重要的内容,可能会导致代码出错或功能失常。

3. Bug分支

修复Bug时,通常我们会创建新的Bug分支进行修复,然后合并,最后删除;

  • 修复Bug时,通常我们会创建新的Bug分支进行修复。可以使用 git branch <branch_name> 命令创建新的分支,然后使用 git switch <branch_name> 命令切换到新分支,也可以使用 git switch -c <branch_name> 命令一次性创建并切换到新分支。
  • 当手头工作没有完成,需要先git stash,这个命令会把你的工作现场储存起来,然后切换到最近的提交的版本。改完Bug后再用git stash pop还原工作现场,可以使用git stash list查看储藏列表;
  • 当你完成Bug修复工作之后,可以使用 git switch <branch_name> 命令切换到你希望合并的分支,然后使用 git merge <branch_name> 命令将Bug分支合并到当前分支。如果希望禁用快速合并,可以使用 git merge --no-ff <branch_name> 命令。
  • 最后,你可以使用 git branch -d <branch_name> 命令删除Bug分支。如果Bug分支还没有被合并到当前分支,Git 会提示你不能删除。如果你希望强制删除Bug分支,可以使用 git branch -D <branch_name> 命令。
  • master分支上修复的Bug,可以通过git cherry-pick <commit_id>将指定的提交复制到当前分支。

4. 多人协作

  • git remote -v查看远程分支详细信息
  • git push origin <branch_name>推送到远程指定的分支上。例如:如果你希望将本地的 dev 分支推送到远程的 origin 仓库的 dev 分支上,可以执行 git push origin dev 命令。
  • git checkout -b dev origin/dev创建远程的dev分支到本地。例如:如果你希望在本地创建 dev 分支,并且这个分支对应的是远程的 origin 仓库的 dev 分支,可以使用 git checkout -b dev origin/dev 命令来创建并切换到本地的 dev 分支。
  • git pull:从远程获取最新版本并merge到本地,会自动合并或修改当前的工作;
  • git fetch:从远程拉取到本地仓库,不会自动合并或修改当前的工作。你需要手动使用 git mergegit rebase 命令来合并远程分支。
  • git branch --set-upstream-to=<remote_name>/<remote_branch_name> <local_branch_name> 命令设置本地分支与远程分支的链接。这样,在本地的分支上执行 git pull 命令就会直接从远程分支上拉取了。例如:git branch --set-upstream-to=origin/dev dev:设置dev分支与远程origin/dev分支的链接,链接完成后,在dev分支中git pull就会直接从origin/dev上拉取了。
  • 在本地分支上执行git rebase <branch_name> 命令,将本地分支的提交应用到另一个分支上。例如:在dev分支上执行git rebase master:若此时master上有新的提交,则用master上的新提交来作为dev的新基底,若master上没有新提交,则类似于进行了merge操作。一般公司里会禁用rebase,统一使用merge,因为rebase会整合分支提交记录,不清楚主线上谁合了代码以及他们合代码的先后顺序。注意:总的原则是,只对尚未推送或分享给别人的本地修改执行变基操作清理历史, 从不对已推送至别处的提交执行变基操作。

参考文献

Git Book

以上是关于Git配置版本控制与分支管理的主要内容,如果未能解决你的问题,请参考以下文章

git

Git 教程:仓库与分支

Git与Github学习版本控制和分支管理

Git与Github学习版本控制和分支管理

Git与Github学习版本控制和分支管理

Git分支管理介绍