git学习记录

git命令

git命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
git config --list
git init
git add .
git commit
git status
git log
git log --oneline

git reset --soft 5af900(摘要编码)
git reset --hard
git reset head^(默认是mixed模式 本地仓库回退,暂存区回退,但本地文件不发生改变,head^代表head指针指向的版本 也就是最新的版本)

#工作区和暂存区域的差异
git diff
#暂存区域和本地仓库的差异
git diff head
#比较两个版本之间的差异
git diff (file1) (file2)
#比较倒数第一个版本和最新版本的差异
git diff head~ head
head~等价于head~1 代表最新版本的前一个提交
#只查看关于file3.txt文件的修改
git diff head~1 head file3.txt


#删除工作区和暂存区的文件
git rm file2.txt
#只删除暂存区的文件
git rm --cached file2.txt, 工作目录还保存


#已经有本地仓库,将本地仓库与远程仓库连接起来
git remote add origin(远程仓库别名) git@github.com:yuntengzhiyu/remote_re.git
#本地main->远端main
git push -u origin main
查看远程仓库origin(fetch和push的仓库地址)
git remote -v
#添加远程仓库
git remote add origin2 git@git.

#拉取分支
git pull(默认是origin main(远程分支):main(本地分支),或者是origin main) 拉取分支并合并

#查看分支
git branch
git branch -a(本地和远程分支)
git branch -vv
#创建分支
git branch dev
#切换分支
git checkout(switch) dev
checkout还可以用来恢复文件,如果分支名和文件名相同 可能有歧义
git checkout (id) #切换到某个commit上,head指针处于分离状态。
git checkout (id) a.txt #恢复a.txt文件到id所在的commit状态
#创建并切换分支
git checkout -b dev
#查看本地分支与远端分支的对应关系
git branch -vv


#查看图形化信息
git log --graph --oneline --decorate --all
#删除分支(要求分支已经合并)
git branch -d dev
#强制删除分支
git branch -D dev
#删除远端分支
git push origin -d dev
#查看远程仓库的分支
git branch -r

#合并分支
在main分支下 git merge branch-name

#完整的合并分支流程
main分支下:
echo "111" >> file1.txt
git add .
git commit
#上面两部可以合并成为git commit -a ""
echo "222" >> file2.txt
git add .
git commit

切换到dev分支
git checkout -b dev
echo "333" >> file3.txt
git add .
git commit

可以查看在不同的分支下ls, git ls-files的情况

git switch main
git merge dev


#完整的处理合并冲突
echo "11" >> file1.txt
git add .
git commit
echo "22" >> file2.txt
git add .
git commit
git checkout -b dev
echo "33" >> file3.txt
git add .
git commit
git switch main
echo "333" >> file3.txt
git add .
git commit
git merge dev
发现file3.txt有冲突
vim file3.txt
修改完毕重新提交
git add .
git commit

第一次创建dev的时候,会在main的基础上创建。dev分支创建之后,合并到main分支上,对dev分支没有影响。当再次切换到dev分支的时候,会重新回到还未被merge到main分支的dev分支处。


#变基操作
在dev分支处变基
git switch dev
git rebase main
dev分支会从交点处断开,接到main分支后面,也就是变基到main上
rebase场景
git fetch origin main
git switch main
git rebase origin/main
或者
git fetch origin main
git switch main
git merge origin/main
或者
git

#head指针
head指向最新的分支

#分别设置不同上游仓库
本地main分支
git push -u origin main(默认是main:main, 也就是本地main到远端main)
git push -u origin(意思是推到上游仓库,仓库地址是origin,可以通过git remote -v查看origin信息)
git push -u origin dev:test(本地dev分支推到远端test分支), 结果可以通过git branch -vv查看。
本地dev分支
git push -u origin dev
查看仓库对应 git branch -vv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
合并分支产生冲突的情况
1. 本地main分支 扩展出dev分支后,在dev分支修改1.txt,并提交
返回main分支,修改1.txt,并提交。此时在main分支git merge dev产生冲突

2.本地dev分支修改1.txt并push到远端,之后提交pull request。如果在这期间,main分支
没有人改动过1.txt,那么可以自动合并冲突。如果在这期间有人改动了main分支的1.txt,那么就需要手动解决pull request的冲突

将dev分支创建pr并合并到main分支之后,可能需要更新一下dev,否则dev落后于main
此时如果紧接着就对dev分支进行了新的操作并push,会发现在github中出现dev分支ahead main,且behind main ,ahead是因为进行了新的更新, behind是因为没有将pr后的main分支更新到dev分支。
可以在本地git fetch origin main , git merge origin main手动解决冲突


通过git branch -vv查看本地分支和远端分支之间的落后关系
如果本地分支落后, git fetch origin main, git merge origin/main
如果本地分支提前, git push

git checkout (commit-id)可以切换到某个commit
1
2
3
4
5
6
#git 标签
git tag v1.0
git tag -a v1.0 -m "version1.0"
查看标签 git tag
删除标签 git tag -d v1.0

1
2
3
4
#本地有但是远程没有的 会删除
git fetch --prune
#git pull = git fetch + git merge
不merge的话 本地的main分支会behind远程main分支
1
2
3
4
5
6
7
8
9
10
11
git fetch和git pull
本地main分支开始会git pull远程的main分支信息。但是过一段时间后,可能有人会commit到远程main分支,执行git fetch, 我们可以使用git log origin/main查看commit信息, 默认的git log不会显示更新后的origin/main信息之后执行git merge origin/main, 将远程main仓库合并到本地main分支。这个时候查看git log就可以显示更新后的origin/main信息

如果确定不会发生冲突 用git pull
如果不确定, 先git fetch origin/main 然后git diff origin/main 查看一下冲突的文件, 再进行git merge.
git fetch origin main + git merge origin/main

git fetch只会把commit记录更新,工作区和暂存区不会发生改变。本地仓库也不会受影响,但是会提前下载好远程commit信息到本地。可以通过git log origin/main查看。或者git diff main origin/main

#fetch远端所有分支
git fetch origin
1
2
3
4
git cherry-pick
如果想要把某个commit应用到另一个分支stable上
git switch stable
git cherry-pick (commit-id)
1
2
3
4
5
6
7
8
什么时候需git stash
本地main分支修改了1.txt 但是还没有commit 接着就想从远端fetch并merge到本地main分支。如果说远端同时也修改了1.txt,那么merge到本地就会error,因为你对1.txt的更新还没有提交就想更新远端1.txt的内容。可以先stash文件。再merge。
merge前 git stash
git show stash@{0}
merge后 git stash apply stash@{0}
or git stash apply
#删除stash
git stash drop stash@{0}
1
2
3
4
orgin main和origin/main的区别
orgin main是远端的main分支, origin/main是远端main分支在本地的快照
git fetch origin main
git merge origin/main
1
2
3
4
5
6
mac系统中.DS_Store文件不希望被跟踪
touch .gitignore
vim .gitignore
添加.DS_Store
#删除被跟踪的文件
git rm --cached .DS_Store
1
2
3
4
5
6
7
8
9
#关于git中撤销的命令
1. 在工作区中修改了还没有add: 如果某个文件已经在暂存区中。我们更改了其内容,但是还没有添加到工作区 ,也就是还没有git add . , 可以用git diff查看工作区和暂存区的不同, 可以通过git checkout a.txt来撤销本次操作
2. 在工作区修改了并且add: git reset a.txt, 此时暂存区会去掉修改的内容, 但是工作区的内容不发生改变。如果就是想去掉暂存区和工作区的内容,使用git checkout HEAD a.txt
3. commit后: git reset --soft head~1 回滚到上一次commit,但是保留工作区和暂存区内容, 也就是只撤销了最新的commit操作
4. 如果想要撤销某一次commit: 使用git revert (commit-id), 就可以添加一个反作用的commit, commitA -> commitB -> commitC. 如果此时想要撤销commitB, 那么git revert (commitB)相当于commitA -> commitB -> commitC -> commit(-B)
移动指针
5. 移动分支
git branch -f branch_name commit_id
将分支指向该commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
git处于分离头状态。
应用git checkout commit-id, 此时head指针不再指向具体的分支, 而指向某个commit, 此时处于分离头状态。在分离头状态下, 如果对文件作出修改,和分支是无关的。如果想把这个修改应用到分支上。 可以在分离头状态单独创建一个分支,git checkout -b newbranch,修改后commit, 回到main分支, git merge newbranch(或者不创建新分支, 而是git cherry-pick commitid)
git cherry-pick案例
git checkout commitid (此时处于分离头状态)
vim 1.txt
git add .
git commit -m ""
git switch main
git relog(查看分离头状态提交的commitid)
git cherry-pick commitid


#交互式变基
git rebase -i head~3 对最近的3次提交变基。
1
2
3
4
5
6
7
git中的相对引用
head^代表head的父节点
head~3, 第三个父节点。

任意移动分支
通过git checkout commit-id可以移动head指针
然后git branch -f branch_name head~number. 可以相对于head随意移动
1
2
3
4
git clone之后,如果切换到远程分支, 此时git是detached head状态。
git clone
git switch origin/main
在此基础上修改, origin/main并不会更新