Git - Book
复习网站:Learn Git Branching
学习了2章,3章,5章节,7.7,10章节
image.png
1.移除git追踪的文件时用命令git rm,这样不仅删除了文件,还解除了git对文件的追踪。如果文件是修改后被存在暂存区的,或者是已经存在暂存区的文件又被修改了的文件,在删除的时候要加上f选项。用rm命令或者手动删除的,虽然可以删除文件但是无法解除git对文件的追踪,会在后续的提交一直显示该文件已经被删除了,而git rm命令会在下次提交的时候不在显示该文件被删除了。
image.png
git追踪的名字改名字,要使用git mv命令。如果直接使用mv命令,是无法成功的,会显示改名后的文件是git没有追踪的文件。因为git跟踪的文件改名会更改元数据的,而元数据是无法反馈在界面或者说是无法反馈出来的。
所有需求在改名的时候,需要把要改名的文件的内容复制到新文件(你要更改的名字),然后删除原文件,跟踪原文件。
如果直接手动更改了原文件的名字,那么git将无法识别更改后的文件。image.png

1
2
git commit --amend//amend是修订的意思,这里的含义是修改上次的提交,修改前的提交并不会出现在
仓库历史版本中。

image.png

1
2
3
4
$ git checkout -- CONTRIBUTING.md//该命令会撤销你的修改,如果你修改的文件在本次提交内(还未提交)
但是已经放在暂存区了,这个时候是把文件恢复到暂存区的样子;如果修改的文件还没有放在暂存区
那么文件恢复到上次提交的样子。或者这样说是恢复到上次跟踪到的地方(放在暂存区还未提交,git刚刚
跟踪到那个地方,会恢复到那个地方;没有放在暂存区git跟踪到上次提交的地方,恢复到上次提交的地方)

【Git】第九章:深度图解分支内部原理-远程分支 - 墨天轮
git pull 实际上是git fetch加上git merge是同步远程分支然后在合并。image.pngimage.pngimage.png

IDEA中使用git

Git | IntelliJ IDEA
VCS是版本控制器的缩写。
1.只能忽略未版本化的文件,即您在未版本化文件更改列表中看到的文件。如果文件已添加到Git但未提交,您可以在本地更改视图中右键单击它并选择回滚。
2.要想把某个文件忽视其变更,可以右击该文件选中git->加入忽略文件中(.gitignore或者.git/info/exclude),已经添加到暂缓区的可以回滚然后在添加到忽视文件中
3.

git总结:

基础:


2.查看当前文件状态:
git status命令;
git status -s显示的是简洁信息;输出的例子有:

1
MM Rakefile//左栏指明了暂存区的状态,右栏指明了工作区的状态。

git add命令不仅有把文件添加到暂存区的功能还有,把未追踪的文件添加到暂存区然后追踪的功能。
3.忽略文件的格式:

1
2
3
4
5
6
7
8
9
所有空行或者以 # 开头的行都会被 Git 忽略。

可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。

匹配模式可以以(/)开头防止递归。

匹配模式可以以(/)结尾指定目录。

要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。

4.移除文件不仅移除该文件还要移除git对它的跟踪:git rm;
5.移动文件:git mv
6.查看提交历史:git log
7.撤销上次提交:git commit --amend
8.取消暂缓文件:git restore --staged 文件名(要从暂缓区移除的文件)
9.撤销文件修改:git checkout – 文件名;将该文件的内容回滚到上个阶段(暂存区->仓库的历史)
10.

问题:

记Git报错-refusing to merge unrelated histories

场景:我在远程创建了一个空仓库,在本地创建了一个新项目(没有创建本地仓库),这个时候在该项目下创建本地仓库和远程仓库关联起来。这里有个问题是:本地仓库和远程仓库的历史版本是不相干的,这个时候使用pull命令再push会报上面的错误,原因是当你pull远程的命令的时候它并没有合并远程分支到当前分支上。这个时候使用git pull origin master --allow-unrelated-histories允许不相干的分支合并就可以解决了。
1.git brach是创建一个新分支,这个时候提交的话!如果没有利用git checkout 切换分支的话,那么仍然是main指针前进指向新提交内容,但是新分支的指针不前进。

合并分支和变基分支的变化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Git合并两个分支的时候,合并的版本是包含两个分支的共同变化的。Git会使用一种叫做三向合并的算法,
来比较两个分支和它们的最近共同祖先的差异,并尝试自动地合并这些差异。如果两个分支对同一个文件的
同一部分做了不同的修改,那么就会产生合并冲突,需要手动解决。Git也提供了一些选项和工具来帮助解
决合并冲突,比如忽略空白改动,或者使用图形化的合并工具。

具体地说,git rebase main的过程是这样的:

• 首先,git会找到当前分支和main分支的最近共同祖先版本,也就是两个分支开始分叉的地方。

• 然后,git会计算出当前分支从最近共同祖先版本到最新版本之间的每一个提交所引入的差异,
并将这些差异保存到临时文件中。

• 接着,git会将当前分支重置到main分支的最新版本,也就是将当前分支指向main分支。

• 最后,git会依次将临时文件中保存的差异应用到当前分支上,从而创建出一系列新的提交。这些新的
提交和原来的提交在内容上是一样的,但在历史上是不同的。

1.HEAD是一个指针,指向当前分支的指针,可以使用git checkout ID把head的指向改变为指向ID这个版本
2. image.png这里是是使用了相对引用,是把pushed分支的前一个版本添加到当前HEAD指向分支的后面,注意这里是添加到HEAD指向的后面,不一定是pushed指向的后面。
3.git branch -f loacl HEAD^如果当前工作的指针也就是HEAD和loacl指向的是同一个版本,那么使用改命令,不仅loacl会移动,HEAD也会移动。 image.png
2,git commit --amend是把当前工作的分支也就是HEAD指向的版本 从仓库拿出来放在暂存区,然后将上次提交的内容和暂存区的内容合并后自动提交,不用在执行git commit提交;这次提交后的HEAD执行的内容是新提交的版本,原先的版本被新版的替换了,不留存于版本库中。一般该命令用来修改提交注释或者是本版本忘记了其他文件的提交(这个时候要先把其他文件放在暂存区中,然后之前提交的版本就会和暂存区合并提交)。
注意它和git checkout --文件名,它的作用是撤销已经修改的文件。
3.git checkout v1;可以将HEAD指向v1标签所指向的提交。
4.本地新建的分支如果没有往远程仓库push过,那么远程就没有创建与之对应的origon/新分支,也就无法pull,特别是像master分支一样可以pull合并。
5.本地仓库能push成功的条件是origon/master和远程仓库的master是指向同一个版本。
6.本地仓库新建了一个分支这个时候pull是会失败的,原因是远程没有对应的新分支,这个时候要先push(别人没有更改远程的仓库)一下,或者只能fetch.
7.git fetch和git pull的区别是:git fetch是拉取分支,但是当前的HEAD不会移动,追踪远程master分支的origion/master会移动。而git pull 是拉取远程的分支然后在合并,合并后HEAD会向前移动
8.image.pngo/main是一个指针,它是一个跟踪远程main分支而生的。当我们git fetch的时候它会检查o/main 和远程的main是否是有关联的(o/main对应远程的main,或者远程的main的前面的版本)如果o/main指向的是远程main的历史版本,那么就会把远程的差的版本拉取到本地,o/main指向拉取到分支的末端,但是main(拉取时所在版本的其他指针)不会移动;如果o/main领先远程的main就会提示本地的已经是最新的了。git checkout -b side o/main 这里的意思是生成新分支side,其side追踪o/main,也就是追踪远程仓库的main;如果side分支没有追踪远程的o/main那么下次提交的时候会自动生成o/main,远程仓库生成side,本地的o/side追踪远程仓库的side.
9.image.png(c0也就是HEAD指向的版本,该版本和其祖先版本没有任何分支追踪远程仓库,无法同步到远程。)
10.image.png
git origin main:切换到本地的main分支然后寻找本地的origin/main映射,将origin/main和main之间的内容同步到远程仓库。
11.远程跟踪分支的理解:

1
2
3
4
5
6
7
8
9
10
11
git 中的 origin/main 是一个远程跟踪分支,它表示 origin 远程仓库的 main 分支在本地的映射。
它可以让您知道 origin 远程仓库的 main 分支的状态和进度,但是它不是一个真正的分支,
您不能在它上面进行开发或提交。
git 中的 origin/main 和 main 的区别是:

• origin/main 是远程跟踪分支,main 是本地分支。

• origin/main 是只读的,main 是可读写的。

• origin/main 是 origin 远程仓库的 main 分支在本地的映射,main 是本地仓库的一个分支。