同步GIT仓库的操作 -- fetch命令 git同步本地到远程
wptr33 2024-11-06 20:32 34 浏览
git fetch命令从远端仓库中下载commits, files, refs到本地仓库中。当你想要看看其他人都在做些什么的时候,就要使用fetch命令。这跟svn update命令很像,同样可以让你看到远端仓库的所有提交进展,但是fetch命令并不强迫让远端的变更合并到你的仓库。Git会对本地内容与fetch下载的内容进行隔离;这就保证了fetch命令更新的远端变更不会对本地正在进行的开发工作产生任何影响。如果想查看通过fetch命令下载的内容,需要显式地通过git checkout命令检出你希望查看的版本。因此在你还不想让远端仓库的版本合并到本地之前,但仍然希望可以查看一下远端版本都做了哪些变更的时候,fetch命令就是一种安全的解决方案。
git pull 和 git fetch 这两个命令都可以用于下载远端仓库。你可以认为git fetch是这两者中更加安全的那个,即便下载了远端的内容,但也不会更新你本地仓库的版本状态,以保证你本地当前代码完好无损。反观git pull命令则是一个更加激进的命令,它会下载当前正在工作的分支对应的远端内容,并且在下载成功之后马上执行一个git merge命令,为新下载下来的远端内容创建一次merge commit。此时如果你有正在进行中的工作还没准备好进行合并,这些行为可能会造成代码冲突,然后马上进入合并代码过程中解决冲突的流程。
git fetch如何操作远端分支
为了更好理解git fetch是如何工作的,我们先来看看Git是如何组织和存储commits的。在大幕之后,Git会将远端与本地的commits保存在 ./.git/objects 文件夹下。Git通过利用分支的refs来区分远端和本地的commits。本地分支的refs都被保存在./.git/refs/heads/文件夹下。当执行git branch命令时会输出本地分支的名称列表,如下所示。
git branch
main
feature1
debug2
查看./.git/refs/heads/文件夹内的文件也会看到同样的输出。
ls ./.git/refs/heads/
main
feature1
debug2
远端的分支与本地类似,只是他们对应的是其他人本地仓库的分支代码。远端分支列表的名称会有远端名称作为前缀以免与本地分支混淆。与本地分支一样,Git也存储了远端分支对应的refs。远端分支的refs存储在./.git/refs/remotes文件夹下。下面的例子展示了fetch远端仓库之后的远端分支列表:
git branch -r
# origin/main
# origin/feature1
# origin/debug2
# remote-repo/main
# remote-repo/other-feature
输出列出了之前我们看到的本地分支,但这次是以 origin/为前缀。此外还列出了以remote-repo为前缀的远端分支。远端分支同样可以像本地分支一样通过check out命令检出,但检出的远端分支会进入游离状态(detached HEAD state)。你可以认为是只读状态。查看远端分支,可以向git branch命令传入-r选项。
如果想查看远端分支的具体细节,可以使用常见的git checkout结合git log命令。如果你接受远端分支的代码修改,就可以使用git merge命令合并远端分支的修改到本地。可见,与SVN不同,将远端仓库同步到本地实际上包含俩个步骤:fetch, 然后merge。git pull命令是这一过程的快捷方式。
git fetch 命令和可选项
git fetch <remote>
Fetch仓库中所有分支。同时也会下载指定远端的所有commits和文件。
git fetch <remote> <branch>
与上面的命令同样,但只会fetch指定分支。
git fetch --all
fetch所有已注册过的远端仓库的全部分支。
git fetch --dry-run
--dry-run选项会执行fetch命令的演练,执行该命令的输出与执行正常fetch命令一致,但不会在本地应用这些变更。
Git fetch示例
git fetch一个远端分支
接下来的示例会展示如果fetch远端分支,以及将远端的内容更新到本地的过程。在此示例中,我们假设已经通过git clone命令从某个中心仓库clone过整个项目。此外我们还假设有一个另外的远端仓库名叫 coworkers_repo,这个仓库中有一个我们希望更新到本地的分支叫做feature_branch。
首先我们需要使用git remote命令来添加这个远端仓库。
git remote add coworkers_repo git@bitbucket.org:coworker/coworkers_repo.git
此时我们已经创建了对于同事仓库的引用。下面我们通过git fetch命令来下载这个仓库中的内容。
git fetch coworkers_repo coworkers/feature_branch
fetching coworkers/feature_branch
现在本地有了来自于coworkers/feature_branch分支的内容,我们需要把这个远端分支的内容整合到本地工作区。首先通过git checkout命令来检出这个远端分支。
git checkout coworkers/feature_branch
Note: checking out coworkers/feature_branch'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
执行命令的输出表明我们正处于一个游离状态(detached HEAD state)。这是可以预见的,同时也意味着我们的HEAD ref的指向不存在于本地仓库的版本更新历史序列中。由于此刻HEAD指针指向coworkers/feature_branch 远端分支,所以我们可以从当前HEAD ref拉出一个新的本地分支。关于'detached HEAD'部分的描述告诉我们如何通过git checkout命令进行操作。
git checkout -b local_feature_branch
这样我们就在本地创建了一个名为 local_feature_branch 分支。此时的HEAD指针指向远端版本的最近一次提交,在本地我们可以在此基础上继续开发。
使用 git fetch 同步origin
下面的例子完整的展示了一个典型场景:如何从中心远端仓库同步主分支到本地仓库。
git fetch origin
执行的输出会显示被下载到本地的所有分支。
a1e8fb5..45e66a4 main -> origin/main
a1e8fb5..9e8ab1c develop -> origin/develop
* [new branch] some-feature -> origin/some-feature
下图中用方块表示远端分支的commits,用以区别使用圆形代表的本地分支commits。如图所示,git fetch命令允许访问另一个仓库的完整分支结构。
如果想查看上游main分支有哪些新增加的commits,可以执行如下git log命令,传入origin/main作为过滤参数:
git log --oneline main..origin/main
在接受变更合并进本地主分支之前,我们可以通过下面的命令先查看本地与远端主分支的差异:
git checkout main
git log origin/main
确认没有问题之后,使用git merge origin/main合并远端变更:
git merge origin/main
到此为止,origin/main分支和本地main分支都指向同一次commit,本地分支与远端分支同步完成。
Git fetch命令总结
- 总体来说git fetch是用于从远端仓库下载内容的主要命令。
- git fetch与git remote,git branch,git checkout以及git reset命令结合使用,用来更新以及保证本地与远端的状态一致。
- git fetch命令在git协作工作流中扮演着非常关键的角色。
- git fetch命令与git pull命令行为类似,但被认为是更安全、非破坏性的更新同步命令。
相关推荐
- 开发者必看的八大Material Design开源项目
-
MaterialDesign是介于拟物和扁平之间的一种设计风格,自从它发布以来,便引起了很多开发者的关注,在这里小编介绍在Android开发者当中里最受青睐的八个MaterialDesign开源项...
- 另类插这么可爱,一定是…(另类t恤)
-
IT之家(www.ithome.com):另类插图:这么可爱,一定是…OSXMavericks和Yosemite打破了苹果对Mac操作系统传统的命名方式,使用加州的某些标志性景点来替换猫...
- Android常用ADB命令(安卓adb工具是什么)
-
杀死应用①根据包名获取APP的PIDadbshellps|grep应用包名②执行kill命令...
- 微软Mac版PowerPoint测试Reading Order Pane功能
-
IT之家5月20日消息,微软公司昨日(5月19日)发布博文,邀请Microsoft365Insiders成员,测试macOS新版PowerPoint演示文稿应用,重点引入...
- Visual Studio跨平台开发实战(4):Xamarin Android控制项介绍
-
前言不同于iOS,Xamarin在VisualStudio中针对Android,可以直接设计使用者界面.在本篇教学文章中,笔者会针对Android的专案目录结构以及基本控制项进行介绍,包...
- 用云存储30分钟快速搭建APP,你信吗?
-
背景不管你承认与否,移动互联的时代已经到来,这是一个移动互联的时代,手机已经是当今世界上引领潮流的趋势,大型的全球化企业和中小企业都把APP程序开发纳入到他们的企业发展策略当中。但随着手机APP上传的...
- 谷歌P图神器来了!不用学不用教,输入一句话,分分钟给结果
-
Pine发自凹非寺量子位|公众号QbitAI当你拍照片时,“模特不好好配合”怎么办?...
- iOS文本编辑控件UITextField和UITextVie
-
记录一个菜鸟的IOS学习之旅,如能帮助正在学习的你,亦枫不胜荣幸;如路过的大神如指教几句,亦枫感激涕淋!细心的朋友可能已经注意到了,IOS学习之旅系列教程在本篇公众号的文章中,封面已经换成美女图片了,...
- Android入门图文教程集锦(android 入门教程)
-
Android入门视频教程集锦AndroidStudio错误gradientandroid:endXattributenotfound...
- 如何使用Android自定义复合视图(如何使用android自定义复合视图)
-
在最近的一个客户应用中,我遇到了一个需求,根据选定的值来生成指定数量的编辑框字段,这样用户可以输入人物信息。最初我的想法是把这些逻辑放到Fragment中,只是根据选中值的变化来向线性布局容器中增加编...
- 原生安卓开发app的框架frida常用关键代码定位
-
前言有时候可能会对APP进行字符串加密等操作,这样的话你的变量名等一些都被混淆了,看代码就可能无从下手...
- 教程10 | 三分钟搞定一个智能输入法程序
-
一案例描述1、考核知识点网格布局线性布局样式和主题Toast2、练习目标掌握网格布局的使用掌握Toast的使用掌握线性布局的使用...
- (Android 8.1) 功能与新特性(android的功能)
-
和你一起终身学习,这里是程序员AndroidAndroid8.1(API级别27)为用户和开发人员引入了各种新特性和功能。本文档重点介绍了开发人员的新功能。通过本章阅读,您将获取到以下内容:Andr...
- 怎样设置EditText内部文字被锁定不可删除和修改
-
在做项目的时候,我曾经遇到过这样的要求,就是跟百度贴吧客户端上的一样,在回复帖子的时候,在EditText中显示回复人的名字,而且这个名字不可以修改和删除,说白了就是不可操作,只能在后面输入内容。在E...
- 如何阻止 Android 活动启动时 EditText 获得焦点
-
技术背景在Android开发中,当活动启动时,EditText有时会自动获得焦点并弹出虚拟键盘,这可能不是用户期望的行为。为了提升用户体验,我们需要阻止...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
-
- 开发者必看的八大Material Design开源项目
- 另类插这么可爱,一定是…(另类t恤)
- Android常用ADB命令(安卓adb工具是什么)
- 微软Mac版PowerPoint测试Reading Order Pane功能
- Visual Studio跨平台开发实战(4):Xamarin Android控制项介绍
- 用云存储30分钟快速搭建APP,你信吗?
- 谷歌P图神器来了!不用学不用教,输入一句话,分分钟给结果
- iOS文本编辑控件UITextField和UITextVie
- Android入门图文教程集锦(android 入门教程)
- 如何使用Android自定义复合视图(如何使用android自定义复合视图)
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)