git用法

一、理解 git fetch, git pull 

要讲清楚git fetch、git pull,必须要附加讲清楚git remote,git merge 、远程repo, branch 、 commit-id 以及 FETCH_HEAD。
1. git remote

 git是一个分布式的结构,这意味着本地和远程是一个相对的名称。
本地仓库(repository)要与远程仓库(repository)配合完成,版本对应必须要有 git remote子命令,通过git remote add来添加当前本地仓库的远程仓库, 有了这个动作本地仓库(repository)就知道了当遇到git push 的时候应该往哪里提交代码
(git push 后不加参数的时候,默认就是git push origin 当前的分支名,比如对本地的master分支执行git push,其实就是git push origin master,当然,如果远程仓库没有master这个分支的话,肯定会报错)。

2. git branch

git天生就是为了多版本分支管理而创造的,因此分支一说,不得不提, 分支就相当于是为了单独记录软件的某一个发布版本而存在的,既然git是分布式的,便有了本地分支和远程分支一说,git branch 可以查看本地分支, git branch -r  可以用来查看远程分支。 本地分支和远程分支在git push 的时候可以随意指定,交错对应,只要不出现版本冲突即可。

3. git merge

git的分布式结构也非常适合多人合作开发不同的功能模块,此时如果每个人都在其各自的分支上开发一个相对独立的模块的话,在每次release制作时都需先将各成员的模块做一个合并操作,用于合并各成员的工作成果,完成集成。 此时需要的就是git merge.

4.git push 和 commit-id

在每次本地工作完成后,都会做一个git commit 操作来保存当前工作到本地仓库(repository), 此时会产生一个commit-id,这是一个能唯一标识一个版本的序列号。 在使用git push后,这个序列号还会同步到远程仓库(repository)。
在理解了以上git要素之后,分析git fetch 和 git pull 就不再困难了。

 二、git fetch 四种基本用法

1. git fetch 

 这将更新git remote 中所有的远程仓库(repository) 所包含分支的最新commit-id, 将其记录到.git/FETCH_HEAD文件中

2. git fetch remote_repository

 这将更新名称为remote_repository 的远程repository上的所有branch的最新commit-id,将其记录。 

3. git fetch remote_repository remote_branch_name

 这将更新名称为remote_repository 的远程repository上的分支: remote_branch_name

4. git fetch remote_repository remote_branch_name:local_branch_name 

这将更新名称为remote_repository 的远程repository上的分支: remote_branch_name ,并在本地创建local_branch_name 本地分支保存远端分支的所有数据。

FETCH_HEAD: 是一个版本链接,记录在本地的一个文件中,指向目前已经从远程仓库取下来的分支的末端版本。

三、git pull 的运行过程

1. git pull 

首先,基于本地的FETCH_HEAD记录,比对本地的FETCH_HEAD记录与远程仓库的版本号,然后git fetch 获得当前指向的远程分支的后续版本的数据,然后再利用git merge将其与本地的当前分支合并。

git pull 后不加参数的时候,跟git push 一样,默认就是git pull origin 当前分支名,当然远程仓库没有跟本地当前分支名一样的分支的话,肯定会报错。
本地master分支执行git pull的时候,其实就是git pull origin master。

2. 拆解git pull 操作
git pull操作其实是git fetch 与 git merge 两个命令的集合。
git pull  等效于先执行 git fetch origin 当前分支名, 再执行 git merge FETCH_HEAD.

通过上述分析,可以知道,如果要合并代码就并不一定要用git merge命令了,也可以用git pull命名,比如要把远程origin仓库的xx分支合并到本地的yy分支,可以有如下两种做法。
第一种,传统标准的做法:
git fetch origin 目标分支名  // fetch到远程仓库目标分支的最新commit记录到  ./git/FETCH_HEAD文件中
git checkout 要被合并的分支名  // 切换到要合并的分支
git merge FETCH_HEAD  // 将目标分支最新的commit记录合并到当前分支

举例说明:将远程origin仓库的xx分支合并到本地的yy分支。
git fetch origin xx
git checkout yy
git merge FETCH_HEAD
完成。

第二种,直接使用pull命令,将远程仓库的目标分支合并到本地的分支:
git pull <remote_repository_name> <branch_name> 

举例说明:将远程origin仓库的xx分支合并到本地的yy分支

git checkout yy

git pull origin xx
完成。

其实还有一种思路,在前面第一种,第二种方式的基础上,可以这样来思考。

是否可以先本地checkout远程目标分支,或者本地已经有了,先pull更新下来,然后将本地的两个分支进行merge不也可以吗?

答案是肯定的。

举个例子:

将远程origin仓库的xx分支合并到本地的yy分支。

git checkout xx

git pull   // 如果本地没有xx分支的,这一步都可以不执行。

git checkout yy   // 切换到yy分支

git merge xx  //  将xx分支合并到yy分支  这一步可以加上 --no-ff 参数,即 git merge --no-ff

posted @ 2023-02-16 15:23  南昌拌粉的成长  阅读(17)  评论(0编辑  收藏  举报