草庐IT

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

林慢慢脑瓜子嗡嗡的 2024-04-09 原文

文章目录

以前有些过渡依赖“小乌龟”,关于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配置、版本控制与分支管理的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  3. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  4. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  5. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  6. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  7. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  8. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  9. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

    如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

  10. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

随机推荐