|
1 |
| ---- |
2 |
| -layout: post |
3 |
| -title: "git学习笔记(未完)" |
4 |
| -subtitle: "Learning to use git" |
5 |
| -date: 2022-12-20 |
6 |
| -author: "Kenshin" |
7 |
| -header-img: "img/post-bg/post-bg-default.png" |
8 |
| -tags: |
9 |
| - - LearnCS |
10 |
| ---- |
11 |
| - |
12 |
| -### 基本 |
13 |
| - |
14 |
| -git add <文件名/目录名> //提交到索引 |
15 |
| - |
16 |
| -git commit -m '<说明>' //将索引区域内容提交到本地仓库 |
17 |
| - |
18 |
| -git status //查看当前 git 状态,有无新的变更 |
19 |
| - |
20 |
| -git log //查看提交记录 |
21 |
| - |
22 |
| -//指定--graph 以文本形式显示更新记录的流程图,指定--oneline 在一行中显示提交的信息 |
23 |
| - |
24 |
| -//使用 git config --global alias.lg "log --graph --oneline" 添加别名 lg 方便使用 |
25 |
| - |
26 |
| -//使用 git config --global core.quotepath off 显示中文字符 |
27 |
| - |
28 |
| -### 推送 |
29 |
| - |
30 |
| -git remote add <name> <repository> //添加远程数据库并起别名,建议为 origin(默认) |
31 |
| - |
32 |
| -git push <repository> <refspec> //指定推送目标地址和推送的分支,不存在的分支会直接创建 |
33 |
| - |
34 |
| -git push -u <repository> <refspec> //使用-u 选项则下一次推送就可以省略分支名称 |
35 |
| - |
36 |
| -### 克隆 |
37 |
| - |
38 |
| -git clone <repository> <directory> |
39 |
| - |
40 |
| -git push //克隆的仓库推送时可以省略名称 |
41 |
| - |
42 |
| -### 拉取 |
43 |
| - |
44 |
| -git pull <repository> <refspec> //仓库省略则拉取到 origin,分支省略则拉取到 master |
45 |
| - |
46 |
| -//pull 后解决冲突后才能再 push |
47 |
| - |
48 |
| -git fetch//查看远程更新历史记录,存放到 FETCH_HEAD |
49 |
| - |
50 |
| -### 分支 |
51 |
| - |
52 |
| -//Merge 分支和 Topic 分支,如以 master 作为 merge 分支,创建 topic 分支以进行修改,测试 bug 等 |
53 |
| - |
54 |
| -git branch //查看分支状态,-a 看远程(要先 fetch) |
55 |
| - |
56 |
| -git branch <branchname> //创建分支 |
57 |
| - |
58 |
| -//HEAD 指向现在使用中的分支的最后一次更新 |
59 |
| - |
60 |
| -git checkout <branch> //切换分支 |
61 |
| - |
62 |
| -git checkout -b <branch> <commitID/branch>//创建并切换分支,可选的创建基于选项,可以是 remote branch(要先 fetch) |
63 |
| - |
64 |
| -git branch -d <branch> //删除分支,必须先离开;分支之间历史记录不一致需要先合并(使用-D 强制删除) |
65 |
| - |
66 |
| -//切换分支不会丢失未提交的索引区域或工作树的内容 |
67 |
| - |
68 |
| -### stash |
69 |
| - |
70 |
| - git stash //暂存修改内容,以消除切换分支的冲突 |
71 |
| - |
72 |
| - git stash pop //还原 |
73 |
| - |
74 |
| - git checkout <directory> //对改动的文件或目录放弃所有更改 |
75 |
| - |
76 |
| -### 合并分支 |
77 |
| - |
78 |
| -/\* |
79 |
| - |
80 |
| -merge:master 无修改则直接合并,称为 fast-forward;否则需要修改冲突,然后合并生成一个新的提交 |
81 |
| - |
82 |
| -rebase:将合并分支的记录添加到被合并分支的后面,需要修改冲突。rebase 后需要将被合并分支的 HEAD 移到最新的位置。与 merge 相比,主要作用是简化提交历史记录,具体的:向 topic 分支中更新 merge 分支,使用 rebase;向 merge 分支导入 topic 分支,先使用 rebase 再使用 merge |
83 |
| - |
84 |
| -\*/ |
85 |
| - |
86 |
| -git merge <commit> //将指定分支导入到 HEAD 分支,因此修改前需要用 checkout 切换 |
87 |
| - |
88 |
| -git diff <filename> //查看冲突内容 |
89 |
| - |
90 |
| -git diff --check |
91 |
| - |
92 |
| -git rebase <branch> |
93 |
| - |
94 |
| -//出现冲突进行修改后,使用 add,再使用 rebase --continue 继续。否则使用--skip 跳过这次提交,或--abort 撤销 rebase 操作 |
95 |
| - |
96 |
| -//最后会进入 VIM,可以添加合并说明 |
97 |
| - |
98 |
| -git rebase -i HEAD~~ //将 HEAD 和 HEAD 前两个提交之间的提交进行修改,squash 汇合,edit 修改.... |
99 |
| - |
100 |
| -git merge --squash <branch> //将 branch 分支所有提交合并生成新的提交到当前所在分支 |
101 |
| - |
102 |
| -### 标签 |
103 |
| - |
104 |
| -//标签是固定的,向 HEAD 添加,分为轻标签和注解标签 |
105 |
| - |
106 |
| -git tag <tagname> //轻标签 |
107 |
| - |
108 |
| -git tag -a <tagname> //注解标签,会进入 VIM 写注解 |
109 |
| - |
110 |
| -git tag -am "<注解>" <tagname> |
111 |
| - |
112 |
| -git tag -n //显示标签的列表和注解 |
113 |
| - |
114 |
| -git tag -d <tagname> //删除标签 |
115 |
| - |
116 |
| -//git checkout -b <branchname> <tagname> //以标签为基础创建并切换新分支,因为 tag 指向的就是一个 commit |
117 |
| - |
118 |
| -### 修改 |
119 |
| - |
120 |
| -git commit --amend -m "新的描述" //主要用于对最近一次提交(HEAD 所在)添加漏掉的档案或修改注解 |
121 |
| - |
122 |
| -git revert <commitID/HEAD> //相较于 reset,可以安全的取消过去发布的提交,不会减少历史记录 |
123 |
| - |
124 |
| -git reset //--soft:只移动 HEAD 位置,只取消提交;--mixed:还修改索引,用于复原修改过的索引的状态;--hard:还修改工作树,彻底取消最近的提交 |
125 |
| - |
126 |
| -git reset --hard HEAD~ //将 HEAD 回退一个操作,~~即两个 |
127 |
| - |
128 |
| -git reset --hard ORIG_HEAD //撤销 |
129 |
| - |
130 |
| -### SSL |
131 |
| - |
132 |
| -ssh-keygen //创建公钥私钥 |
133 |
| - |
134 |
| -..... |
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: "Git - 版本控制工具" |
| 4 | +subtitle: "Version Control Tool - Git" |
| 5 | +date: 2022-12-20 |
| 6 | +author: "Kenshin" |
| 7 | +header-img: "img/post-bg/post-bg-default.png" |
| 8 | +tags: |
| 9 | + - LearnCS |
| 10 | +--- |
| 11 | + |
| 12 | +# Git - 版本控制工具 |
| 13 | + |
| 14 | +## 基础配置 |
| 15 | + |
| 16 | +``` |
| 17 | +git config --global user.name <YourName> |
| 18 | +git config --global user.email <YourEMail> |
| 19 | +git config --list --global |
| 20 | +``` |
| 21 | + |
| 22 | +## 核心架构 |
| 23 | + |
| 24 | +- 工作区域  Working Directory  modified |
| 25 | +- 暂存区域  Stage(Index)     staged |
| 26 | +- Git仓库  Repository(HEAD)   commited |
| 27 | + |
| 28 | +### basic |
| 29 | + |
| 30 | +git add <文件名/目录名> //提交到索引 |
| 31 | + |
| 32 | +git commit -m "<说明>" //将索引区域内容提交到本地仓库 |
| 33 | + |
| 34 | +git commit -am "<说明>" //从工作区提交到本地仓库 |
| 35 | + |
| 36 | +git status //查看当前 git 状态,有无新的变更 |
| 37 | + |
| 38 | +git log //查看提交记录 |
| 39 | + |
| 40 | +//指定--graph 以文本形式显示更新记录的流程图,指定--oneline 在一行中显示提交的信息 |
| 41 | + |
| 42 | +//使用 git config --global alias.lg "log --graph --oneline" 添加别名 lg 方便使用 |
| 43 | + |
| 44 | +git log --oneline --decorate --graph --all |
| 45 | + |
| 46 | +//使用 git config --global core.quotepath off 显示中文字符 |
| 47 | + |
| 48 | +git reflog //记录的每一次操作的版本ID号 |
| 49 | + |
| 50 | +### push |
| 51 | + |
| 52 | +git remote add <name> <repository> //添加远程数据库并起别名,建议为 origin(默认) |
| 53 | + |
| 54 | +git push <repository> <refspec> //指定推送目标地址和推送的分支,不存在的分支会直接创建 |
| 55 | + |
| 56 | +git push -u <repository> <refspec> //使用-u 选项则下一次推送就可以省略分支名称 |
| 57 | + |
| 58 | +### clone |
| 59 | + |
| 60 | +git clone <repository> <directory> |
| 61 | + |
| 62 | +git push //克隆的仓库推送时可以省略名称 |
| 63 | + |
| 64 | +### pull |
| 65 | + |
| 66 | +git pull <repository> <refspec> //仓库省略则拉取到 origin,分支省略则拉取到 master |
| 67 | + |
| 68 | +git fetch//查看远程更新历史记录,存放到 FETCH_HEAD |
| 69 | + |
| 70 | +### branch |
| 71 | + |
| 72 | +//Merge 分支和 Topic 分支,如以 master 作为 merge 分支,创建 topic 分支以进行修改,测试 bug 等 |
| 73 | + |
| 74 | +git branch //查看分支状态,-a 看远程(要先 fetch) |
| 75 | + |
| 76 | +git branch <branchname> //创建分支 |
| 77 | + |
| 78 | +//HEAD 指向现在使用中的分支的最后一次更新 |
| 79 | + |
| 80 | +git checkout <branch> //切换分支 |
| 81 | + |
| 82 | +git checkout -b <branch> <commitID/branch>//创建并切换分支,可选的创建基于选项,可以是 remote branch(要先 fetch) |
| 83 | + |
| 84 | +git branch -d <branch> //删除分支,必须先离开;分支之间历史记录不一致需要先合并(使用-D 强制删除) |
| 85 | + |
| 86 | +//切换分支不会丢失未提交的索引区域或工作树的内容,但会丢弃匿名分支的所有修改 |
| 87 | + |
| 88 | +### checkout |
| 89 | + |
| 90 | +//从历史快照(或者暂存区域)中拷贝文件到工作目录 |
| 91 | + |
| 92 | +git checkout HEAD~ README.md //从指定的提交中拷贝文件到暂存区域和工作目录 |
| 93 | + |
| 94 | +git checkout -- README.md //如果命令中没有指定具体的快照 ID,则将从暂存区域恢复指定文件到工作目录,加--是为了防止有个分支名字加README.md |
| 95 | + |
| 96 | +### stash |
| 97 | + |
| 98 | + git stash //暂存修改内容,以消除切换分支的冲突 |
| 99 | + |
| 100 | + git stash pop //还原 |
| 101 | + |
| 102 | + git checkout <directory> //对改动的文件或目录放弃所有更改 |
| 103 | + |
| 104 | +### merge & rebase |
| 105 | + |
| 106 | +/\* |
| 107 | + |
| 108 | +merge:master 无修改则直接合并,称为Fast-forward;否则需要修改冲突,然后合并生成一个新的提交-Three-way merge |
| 109 | + |
| 110 | +rebase:将合并分支的记录添加到被合并分支的后面,需要修改冲突。rebase 后需要将被合并分支的 HEAD 移到最新的位置。与 merge 相比,主要作用是简化提交历史记录,具体的:向 topic 分支中更新 merge 分支,使用 rebase;向 merge 分支导入 topic 分支,先使用 rebase 再使用 merge |
| 111 | + |
| 112 | +\*/ |
| 113 | + |
| 114 | +git merge <commit> //将指定分支导入到 HEAD 分支,因此修改前需要用 checkout 切换 |
| 115 | + |
| 116 | +//使用--no-ff 禁止fast forward,保留merge branch信息 |
| 117 | + |
| 118 | +git diff <filename> //查看冲突内容 |
| 119 | + |
| 120 | +git diff --check |
| 121 | + |
| 122 | +git rebase <branch> |
| 123 | + |
| 124 | +//出现冲突进行修改后,使用 add,再使用 rebase --continue 继续。否则使用--skip 跳过这次提交,或--abort 撤销 rebase 操作 |
| 125 | + |
| 126 | +//最后会进入 VIM,可以添加合并说明 |
| 127 | + |
| 128 | +git rebase -i HEAD~~ //将 HEAD 和 HEAD 前两个提交之间的提交进行修改,squash 汇合,edit 修改.... |
| 129 | + |
| 130 | +git merge --squash <branch> //将 branch 分支所有提交合并生成新的提交到当前所在分支 |
| 131 | + |
| 132 | +### diff |
| 133 | + |
| 134 | +git diff //比较暂存区和工作目录的文件内容 |
| 135 | + |
| 136 | +```bash |
| 137 | +# 出现乱码 |
| 138 | +git config --global i18n.commitencoding utf-8 |
| 139 | +git config --global i18n.logoutputencoding utf-8 |
| 140 | + |
| 141 | +export LESSCHARSET=utf-8 # linux bash配置环境变量 |
| 142 | +set LESSCHARSET=utf-8 # windows配置环境变量 |
| 143 | +``` |
| 144 | + |
| 145 | +git diff ID1 ID2 //比较仓库中两个快照的差异 |
| 146 | + |
| 147 | +git diff ID //比较当前工作目录内容和之前快照的差异 |
| 148 | + |
| 149 | +git diff HEAD //比较当前工作目录内容和当前快照的差异 |
| 150 | + |
| 151 | +git diff --cached ID |
| 152 | + |
| 153 | + |
| 154 | + |
| 155 | +### tag |
| 156 | + |
| 157 | +//标签是固定的,向 HEAD 添加,分为轻标签和注解标签 |
| 158 | + |
| 159 | +git tag <tagname> //轻标签 |
| 160 | + |
| 161 | +git tag -a <tagname> //注解标签,会进入 VIM 写注解 |
| 162 | + |
| 163 | +git tag -am "<注解>" <tagname> |
| 164 | + |
| 165 | +git tag -n //显示标签的列表和注解 |
| 166 | + |
| 167 | +git tag -d <tagname> //删除标签 |
| 168 | + |
| 169 | +//git checkout -b <branchname> <tagname> //以标签为基础创建并切换新分支,因为 tag 指向的就是一个 commit |
| 170 | + |
| 171 | +### reverse & reset |
| 172 | + |
| 173 | +git commit --amend -m "新的描述" //主要用于对最近一次提交(HEAD 所在)添加漏掉的文件或修改注解 |
| 174 | + |
| 175 | +git revert <commitID/HEAD> //相较于 reset,可以安全的取消过去发布的提交,不会减少历史记录 |
| 176 | + |
| 177 | +git reset //--soft:只移动 HEAD 位置,只取消提交;--mixed:**默认**,还修改索引,用于复原修改过的索引的状态;--hard:还修改工作树,彻底取消最近的提交 |
| 178 | + |
| 179 | +//移动 HEAD 指针(--soft) -> 覆盖暂存区域(--mixed,默认)-> 覆盖工作目录(--hard) |
| 180 | + |
| 181 | +git reset --hard HEAD~ //将 HEAD 回退一个操作,~~即两个 |
| 182 | + |
| 183 | +git reset --hard ORIG_HEAD //撤销 |
| 184 | + |
| 185 | +git reset 快照 文件 // 不移动HEAD,只回滚指定文件到暂存区域 |
| 186 | + |
| 187 | +git rm 文件//删除工作目录和暂存区域的文件,在快照中的要用reset --soft HEAD~ |
| 188 | + |
| 189 | +git rm -f 文件//如果工作目录和暂存区域内文件内容不同,加-f同时删除两个文件,--cached删除暂存区域内的文件,保留工作目录的文件 |
| 190 | + |
| 191 | +git rm --cached 文件 |
| 192 | + |
| 193 | +git mv 旧文件名 新文件名//重命名文件 |
| 194 | + |
| 195 | +### SSL |
| 196 | + |
| 197 | +ssh-keygen //创建公钥私钥 |
| 198 | + |
| 199 | +### checkout和reset的区别 |
| 200 | + |
| 201 | +reset 命令只将指定文件恢复到暂存区域(--mixed),而 checkout 命令是同时覆盖暂存区域和工作目录。 |
| 202 | + |
| 203 | +无法使用git reset --hard HEAD~ README.md 命令让 reset 同时覆盖工作目录 |
0 commit comments