草庐IT

git 常用命令之 git checkout

IAM17前端 2023-04-12 原文

大家好,我是 17。

git checkout 是 git 中最重要最常用的命令之一,本文为大家详细解说一下。

恢复工作区

checkout 的用途之一是恢复工作区。

git checkout .  

checkout . 表示恢复工作区的所有更改,未跟踪的文件不会有变化。

恢复工作区的所有文件风险比较大,会丢失所有工作区的修改,一定要慎用

git checkout -- a.txt

中间加上 – 就安全多了,可以只恢复单个文件。

版本切换

git checkout master   取出 master 分支,HEAD 指向 master
git checkout 907d3ba  取出最后提交为 commit id 为 907d3ba 这个版本,HEAD 转到 907d3ba,和 master 分离。

取出分支的时候 HEAD 会指向当前分支。取出某个版本,HEAD也会跟着指过来,分支不动。这会造成 HEAD 和分支 分离。在分离 HEAD 的情况下,可以查看,提交,做各种试验,如果对结果满意,可以就地打新分支保留这些提交:

git checkout -c <new-branch-name>

如果不满意,什么也不用做,切回当前分支既可。

git checkout master  修正 HEAD 指向 master 分支

如果不知道哪前分支名也没关系 checkout - 同样会修正 HEAD。

git checkout -  

如果要开发新功能,直接在某个提交上打分支即可,为什么要分离 HEAD?原因是这样比较轻量。比如你现在想开发一个功能,但不知道是否可行,所以先试验一下,确认好了再打分支。如果直接打分支,觉得不合适还得删除。因为分支没有合并,还删不掉,删除还得加强制删除参数。

分离头指针的操作相当于 先上车,后补票 。上车后又下车,不用买票,只有到终点才需要补票。

强制拉分支

 git checkout -B dev 

假定 dev 存在,如果没有 -B 参数,会报错,加上 -B 会覆盖原来的 dev 分支,打一个新的 dev 分支出来,并转到 dev 分支。

省得费心起名了。如果并行的只有一个任务,可以每次都用 dev 分支开发。

从某个 commit 打分支

我们打分支的时候,默认会从 HEAD 处开始,对于 master 分支来说,就是 G。

如果从 F 处打分支出来,可以用第二个参数指定

git checkout -b dev F

也可以这样写
git checkout -b dev HEAD^

孤儿分支

有这样一个参数 --orphan, orphan 的英文原意是孤儿,如果我们要打一个设计文档分支出来这样写

git checkout --orphan design

因为设计文档和开发的代码完全是独立的部分,不适合和开发代码放一个分支上。

之所以称为孤儿分支,是因为这个分支是完完全全独立的,和以前所有的分支没有任何关联。和其它分支是平行的,永远不会相交。

就算孤儿分支是从 master 分支打出来的,你在 master 分支 执行 git log --oneline 也找不到任何有关孤儿分支的痕迹。当然更无法 merge 一个孤儿分支,实际上,也没有这个需求。

孤儿分支刚生成的时候,没有父提交,也没有任何提交,完全是空的,暂存区和工作区一般来说会有内容,因为我们要存设计文档,原来的内容都没有用,删除

git rm -rf .

现在我们得到了一个纯净的,独立的分支,可以添加设计文档了,并生成第一个提交。

可能你会有疑问,既然我们要一个孤儿分支,为什么还要初始化内容给我们?因为我们可能还有这样的需求:需要一个起点,而不是从一无所有开始。

试想这样的场景:项目开发半年了,市场反馈却是平平,老板觉得这样下去不是办法,需要另寻出路,但又不想放弃现在的方向。因为这次是方向性的问题,改动比较大,如果打普通分支的话,可能无法向主干合并。于是老板想出了一个办法,新建一个孤儿分支,完全独立来验证新想法,如果新方向正确,就可以代取代原来的方向。

从头来实现项目来验证新想法显然是不实际的,可以从项目中选择合适的节点,比如 F 节点,以这个为基础。

git checkout --orphan laboratory  F

新分支生成后,会把 F 节点的所有内容带到暂存区和工作区,我们全部保留,在这个基础上开发。laboratory 和原来的 master 分支的级别是完全一样的,laboratory 就相当于原来的 master 分支。master 只是提供了一个起点。laboratory 后面如何发展和 master 完全没有关系。

选择合并

git checkout master
git merge dev

merge dev 的时候发生的冲突,这时可以打开冲突文件手动修改,也可以自动修改

git checkout --ours a.txt
git checkout --theirs a.txt

下面举例说明一下如何自动修改。

首先制造一个 merge 冲突的现场。起点在 master 分支。 在 master 分支 和 dev 分支同时修改 a.txt 的第一行,

echo init >a.txt
git add a.txt
git commit -m 'add a.txt'

git checkout -b dev
echo dev >a.txt
git add a.txt
git commit -m 'alter a.txt'

git checkout master
echo master >a.txt
git add a.txt

git merge dev

看下 a.txt 的内容 cat a.txt

<<<<<<< HEAD
master
=======
dev
>>>>>>> dev

上面的是 master 的修改,下面的是 dev 的修改。

如果现在后悔了,想取消合并,恢复到合并前的状态,

git merge --abort

自动修改用 git checkout 命令。我们可以选择保留 master 分支的内容

git checkout --ours -- a.txt

查看 a.txt 内容,已经恢复正常了。

master

如果发现这不是我们要的结果,可以恢复冲突现场

git checkout -m -- a.txt

查看 a.txt ,又恢复到冲突状态了。这次我们选择 dev 的内容。

git checkout --theirs -- a.txt

检查内容无误后,添加到暂存区。

git add a.txt

冲突解决完了,但 merge 还没完成。

git merge --continue

这时弹出编辑器,可以修改提交信息,确认后会自动提交修改的内容。merge 完成。

新加的 git switch

你会发现 checkout 承载了很多分支相关的命令。为了让命令更清晰,新版 git 增加了 switch 命令。
switch 能做的事 checkout 都能做。

switch 命令的功能很纯粹,就是切换分支,如果分支不存在,顺便新建分支。

举两个常见的例子。

switchcheckout
git switch mastergit checkout master
git switch -c devgit checkout -c dev
git switch --orphangit checkout --orphan

切分支的时候建议把工作区和暂存区的内容都提交

新加的 git restore

和增加 git switch 同样的原因,新版本增加了 git resotre 命令。

git resotre 的职责是恢复工作区和暂存区。原来 checkout 能做的,它都能做。它能做的, checkout 可能做不了。

--worktreegit restore 的默认参数

git restore a.txt  把暂存区 a.txt 的内容恢复到工作区
git restore .   恢复工作区的所有内容。

git restore --staged a.txt 把 HEAD 的 a.txt 恢复到暂存区


git restore --source=HEAD --staged --worktree a.txt 恢复工作区和暂存区

–source 表示从哪里来,默认是 HEAD --staged 表示恢复到暂存区,–worktree 表示恢复到工作区。这三个参数有简写方式。

git restore -s HEAD -SW a.txt

当 merge 发生冲突时,也可以用 restore 来解决冲突,用法同 checkout。

有关git 常用命令之 git checkout的更多相关文章

  1. 华为常用命令 - 2

    system-view进入系统视图quit退到系统视图sysname交换机命名vlan20创建vlan(进入vlan20)displayvlan显示vlanundovlan20删除vlan20displayvlan20显示vlan里的端口20Interfacee1/0/24进入端口24portlink-typeaccessvlan20把当前端口放入vlan20undoporte1/0/10删除当前VLAN端口10displaycurrent-configuration显示当前配置02配置交换机支持TELNETinterfacevlan1进入VLAN1ipaddress192.168.3.100

  2. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  3. ruby - Dropbox 类似 git 的服务——没有 rsync 和 inotify - 2

    关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec

  4. ruby - 混帐 & ruby : How can I unset the GIT_DIR variable from inside a ruby script? - 2

    我编写了一个非常简单的“部署”脚本,作为我的裸git存储库中的post-updateHook运行。变量如下livedomain=~/mydomain.comstagingdomain=~/stage.mydomain.comgitrepolocation=~/git.mydomain.com/thisrepo.git(bare)core=~/git.mydomain.com/thisrepo.gitcore==addedremoteintoeachlive&stagegitslive和stage都初始化了gitrepos(非裸),我已经将我的裸仓库作为远程添加到它们中的每一个(名为co

  5. ruby - 让 bundler 使用 http : instead of git:? - 2

    我正在安装gitlabhq,并且在Gemfile中有对某些资源的“git://...”的引用。但是,我在公司防火墙后面,所以我必须使用http://。我可以手动编辑Gemfile,但我想知道是否有另一种方法告诉bundler使用http://作为git存储库? 最佳答案 您可以通过运行gitconfig--globalurl."https://".insteadOfgit://或通过将以下内容添加到~/.gitconfig:[url"https://"]insteadOf=git://

  6. ruby-on-rails - 安装 active admin 时 activeadmin.git (at master) is not yet checked out 错误 - 2

    Activeadmingem已添加到我的rails项目中,但每次我尝试安装railsgactive_admin:install时,我都会收到类似的错误git://github.com/activeadmin/activeadmin.git(atmaster)isnotyetcheckedout.Runbundleinstallfirst.我肯定在运行“railsgactive_admin:install”之前运行了bundle。运行“bundleshow”后,我看到我已将“*activeadmin(1.0.0.pre3f916d6)”添加到我的项目中,但不断收到此错误消息。我的gem文

  7. ruby - git:从 bitbucket 导出并导入 github(带提交) - 2

    我在bitbucket上创建了一个私有(private)git存储库并提交了代码。现在我想导出所有(提交、代码、历史记录)并将其导入github上的gitrepo。有没有办法做到这一点?谢谢 最佳答案 在本地检查所有内容到您的计算机和gitpull。创建一个github存储库将此存储库添加为您的第二个远程(“使用gitremote添加githubURL”)推送到第二个Remote 关于ruby-git:从bitbucket导出并导入github(带提交),我们在StackOverflow

  8. Unity 报错No ‘git‘ executable was found. Please install Git on your system then restart - 2

    亲测可用。Anerroroccurredwhileresolvingpackages:Projecthasinvaliddependencies: com.unity.xxx:No'git'executablewasfound.PleaseinstallGitonyour  systemthenrestartUnityandUnityHub在我们使用PackageManager时,Unity允许我们使用Git上的package(点击加号,选择addpackagefromgitURL,或者是直接在Asset/Packages/manifest.json中添加包名)。但是这种操作需要我们事先装好g

  9. ruby - RSpec Git Bash Windows——缺少颜色? - 2

    我在Windows上使用GitBash来完成我的大部分Rails工作,每次我运行bundleexecrspecspec它都会提醒我“你必须geminstallwin32console才能使用Windows上的颜色”,然后以纯黑色和白色运行RSpec。但是我确实安装了win32console,当我在列表中运行gemlist时,它有win32console(1.3.0x86-mingw32)。RSpec工作正常,但我希望它有一些颜色。我用谷歌搜索了这个并找到了多种解决方案,但似乎没有一个适合我。有人可以写出在GitBashforWindows上使用RSpec获取颜色的“循序渐进”方法吗?

  10. ruby - git 最好的 ruby​​ api 是什么? - 2

    我想实现一个Rake任务,自动执行一些我必须完成的任务,以便将我的更改从开发转移到生产(是的,我知道有像Capistrano这样的东西,它对我来说太多了).中间是gitadd-i等一些交互命令,以及一系列commit和push。在生产方面,将有pull和Assets任务要做。一直输入相同的命令很乏味,所以我想完全自动化。我还没有找到Git的RubyAPI。它应该在Windows7下工作,并且至少允许以下命令:gitadd、gitstatus、gitcommit、gitpush,gitpull. 最佳答案 我知道,坏习惯,但我想记录一

随机推荐