工作区(Working Directory)
就是你在电脑里能看到的目录
版本库(Repository)
工作区有一个隐藏目录 .git ,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的 第一个分支 master ,以及指向 master 的一个指针叫 HEAD
![image-20210721151058465](https://gitee.com/qhzeng/markdown/raw/master/image/image-20210721142430619.png)
第一步是用 git add 把文件添加进去,实际上就是把文件修改添加到暂存区;
对文件的所有修改都会放在暂存区
第二步是用 git commit 提交更改,实际上就是把暂存区的所有内容提交到当前分支。
分支
一开始的时候, master 分支是一条线,Git用 master 指向最新的提交,再用 HEAD 指向 master ,就能确定当 前分支,以及当前分支的提交点:
![image-20210721151002173](https://gitee.com/qhzeng/markdown/raw/master/image/image-20210721151002173.png)
每次提交, master 分支都会向前移动一步,这样,随着你不断提交, master 分支的线也越来越长。 当我们创建新的分支,例如 dev 时,Git新建了一个指针叫 dev ,指向 master 相同的提交,再把 HEAD 指 向 dev ,就表示当前分支在 dev 上:
![image-20210721151058465](https://gitee.com/qhzeng/markdown/raw/master/image/image-20210721151058465.png)
假如我们在 dev 上的工作完成了,就可以把 dev 合并到 master 上。Git怎么合并呢?最简单的方法,就是直接 把 master 指向 dev 的当前提交,就完成了合并:
![image-20210721151137097](https://gitee.com/qhzeng/markdown/raw/master/image/image-20210721151137097.png)
![image-20210721151156393](Git进阶.assets/image-20210721151156393.png)
cherry-pick
Git专门提供了一个 cherry-pick 命令,让我们能复制一个特定的提交到当前分支
将在dev做的提交,复制一份到master
多人协作
当你从远程仓库克隆时,实际上Git自动把本地的 master 分支和远程的 master 分支对应起来了,并且,远程仓库 的默认名称是 origin 。 要查看远程库的信息,用 git remote :
推送分支
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到 远程库对应的远程分支上:
但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
master 分支是主分支,因此要时刻与远程同步;
dev 分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
抓取分支
多人协作时,大家都会往 master 和 dev 分支上推送各自的修改。
如果你的小伙伴的最新提交和你试图推送的提交有冲突,解决办法也很简单,Git已经提示我们,
先 用 git pull 把最新的提交从 origin/dev 抓下来,
然后,在本地合并,解决冲突,再推送:
因此,多人协作的工作模式通常是这样:
- 首先,可以试图用
git push origin <branch-name>
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功!
如果git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
。
Rebase变基
多人在同一个分支上协作时,很容易出现冲突。即使没有冲突,后push的童鞋不得不先pull, 在本地合并,然后才能push成功。最后分支会变得很乱
![image-20210721153723962](https://gitee.com/qhzeng/markdown/raw/master/image/image-20210721153723962.png)
IDEA Git
![image-20210721155613292](https://gitee.com/qhzeng/markdown/raw/master/image/image-20210721155613292.png)
Fetch ——查看远程更新的记录
当您从上游获取更改时,自您上次与远程存储库同步以来所做的提交中的所有新数据都将下载到您的本地副本中。这些新数据不会集成到您的本地文件中,并且更改不会应用于您的代码。
获取的更改存储为远程分支,这使您有机会在将它们与文件合并之前查看它们。由于fetch不会影响您的本地开发环境,因此这是获取远程存储库所有更改更新的安全方法。
Update——更新代码
Develop———Origin/Develop
Master——Origin/Master
如果您需要将特定分支与其远程跟踪分支同步,请使用更新。这是获取并随后将更改应用到所选分支的便捷快捷方式。
Pull
如果您需要从另一个分支而不是其远程跟踪分支获取对当前分支的更改,请使用pull。当你pull 时,你不仅会下载新数据,还会将它集成到项目的本地工作副本中。
![image-20210721160032211](https://gitee.com/qhzeng/markdown/raw/master/image/image-20210721160032211.png)
- 选择更新类型(此策略将应用于 Git 版本控制下的所有根目录):
- 将传入的更改合并到当前分支:选择此选项以在更新期间执行合并。这相当于运行
git fetch
然后git merge
, 或git pull --no-rebase
。 - 变基上的传入更改顶部当前分支:选择此选项来执行Rebase在更新过程中。这相当于运行
git fetch
然后git rebase
, orgit pull --rebase
(所有本地提交都将放在更新的上游头之上)。
- 将传入的更改合并到当前分支:选择此选项以在更新期间执行合并。这相当于运行
Rebase和Merge的区别
合并和rebase提供了相同的目的,以将来自一个分支(有时倍数分支)的变化集成到另一个分支中。最常用的是在打开Pull请求之前将最新的Master或开发分支集成。虽然目的是相同的,但Merge和Rebase达到的方式不同。
merge
使用 merge 可以合并多个历史记录的流程,需要解决冲突
rebase
获取远程项目中最新代码时:
git pull --rebase