Compare commits
42 Commits
old_practi
...
master
Author | SHA1 | Date | |
---|---|---|---|
11f7e06250 | |||
fb0dd4d613 | |||
47fd86d4fa | |||
4bb20fac5f | |||
8c6aed4ca1 | |||
49c43b568f | |||
615467d28c | |||
31f7a8f26d | |||
c59ecd2869 | |||
18f2b57018 | |||
5f7b2c5779 | |||
0a3fecc92e | |||
6a398dcde8 | |||
f9e486b837 | |||
37a4decc83 | |||
f2dd2b6d5c | |||
ca358d7dcb | |||
572f5215ce | |||
9d867fc271 | |||
515dd2b9c4 | |||
7fca44eac8 | |||
ce2b85da59 | |||
df3218e422 | |||
73624ddf35 | |||
a4039843d6 | |||
a8029669af | |||
7952818907 | |||
15c0ebbff6 | |||
61d0e63490 | |||
c6700dec10 | |||
7476f0a141 | |||
51bc20bac1 | |||
81d8e86df1 | |||
570f8b26ee | |||
e8a66d4e72 | |||
5032b7e8f1 | |||
21e8c37152 | |||
659bfc6fbc | |||
22908a85ac | |||
07d5cbd029 | |||
17844d154a | |||
dbda7e15b0 |
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
*.swp
|
||||
*.h
|
||||
hello
|
||||
*.pyc
|
1
Morgen.txt
Normal file
1
Morgen.txt
Normal file
@ -0,0 +1 @@
|
||||
Guten Morgen
|
1
notes/.gitignore
vendored
Normal file
1
notes/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
*.pyc
|
49
notes/2.10-git_clone.md
Normal file
49
notes/2.10-git_clone.md
Normal file
@ -0,0 +1,49 @@
|
||||
## 2.10 git clone建立版本库克隆
|
||||
|
||||
### 2.10.1
|
||||
|
||||
!()[https://www.worldhello.net/gotgit/images/git-clone-pull-push.png]
|
||||
|
||||
```bash
|
||||
git clone <repo> <dir>
|
||||
git clone --bare <repo> <dir.git> # 不含工作区,不注册,不能用git fetch
|
||||
git clone --mirror <repo> <dir.git> # 不含工作区,注册,可以用git fetch
|
||||
```
|
||||
|
||||
```bash
|
||||
git push [<remote-repos> [refspec>]]
|
||||
git pull [<remote-repos> [refspec>]]
|
||||
```
|
||||
|
||||
### 2.10.2 test
|
||||
|
||||
对本地的git仓库进行backup
|
||||
```bash
|
||||
git clone /path/to/my/workspace/demo /path/to/my/workspace/demo-backup
|
||||
```
|
||||
|
||||
此时从主仓库到备用仓库中push是无法push的,因为备用仓库不是bare repo,用工作目录,直接更新会导致工作目录和最新的commit不一致,很奇怪。
|
||||
|
||||
此时应该从备用仓库中git pull。
|
||||
|
||||
git clone会自动在本地仓库中说明远程仓库是在哪
|
||||
```bash
|
||||
git remote -v
|
||||
```
|
||||
|
||||
### 2.10.3 推送到裸仓库中
|
||||
|
||||
```bash
|
||||
git push /path/to/bare/repo.git
|
||||
```
|
||||
|
||||
### 2.10.4 创建裸版本仓库
|
||||
|
||||
```bash
|
||||
git init --bare demo-init.git
|
||||
```
|
||||
|
||||
```bash
|
||||
git push /path/to/repo.git master:master #如果碰见没有指定的推送,需要加上master:master
|
||||
```
|
||||
|
3
notes/2.11-git_repo_manage.md
Normal file
3
notes/2.11-git_repo_manage.md
Normal file
@ -0,0 +1,3 @@
|
||||
## 2.11 git库管理
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
## 2.7 Git Basic Ops
|
||||
|
||||
## 2.7.1 git tag
|
||||
### 2.7.1 git tag
|
||||
|
||||
给当前的进度打个标签
|
||||
```bash
|
||||
@ -8,7 +8,7 @@ git tag -m "some message" <version-string>
|
||||
git describe # 查看标签
|
||||
```
|
||||
|
||||
## 2.7.2 Git 删除文件
|
||||
### 2.7.2 Git 删除文件
|
||||
git
|
||||
|
||||
```bash
|
||||
@ -26,3 +26,71 @@ git ls-files --with-tree=HEAD^ # 父节点中的文件还在
|
||||
git add -u #将版本库中的本地文件的变更记录到暂存区中
|
||||
```
|
||||
|
||||
### 2.7.3 恢复删除的文件
|
||||
|
||||
```bash
|
||||
git cat-file -p HEAD~1:filename > filename
|
||||
```
|
||||
|
||||
### 2.7.4 移动文件
|
||||
|
||||
```bash
|
||||
git mv welcome.txt README # git提供的git mv来移动文件
|
||||
git commit -m "rename test" # 在输出的结果中可以查看改名前后两个文件的相似度
|
||||
```
|
||||
|
||||
### 2.7.5 显示版本号
|
||||
|
||||
```bash
|
||||
git describe # 展示版本号
|
||||
```
|
||||
|
||||
```bash
|
||||
git log --oneline --decorate -4 #在提交日志中显示提交对应的Tag
|
||||
```
|
||||
|
||||
### 2.7.6 git add -i
|
||||
|
||||
```bash
|
||||
git add -i #进入一个交互式的提交脚本
|
||||
```
|
||||
|
||||
### 2.7.8 Git忽略
|
||||
|
||||
就是编辑.gitignore文件
|
||||
|
||||
可以设置全局忽略的文件位置
|
||||
|
||||
```bash
|
||||
git config --global core.excludesfile /path/to/file
|
||||
git config core.excludesfile
|
||||
```
|
||||
|
||||
小trick,可以用cat快速写入一个文件
|
||||
```bash
|
||||
cat > .gitignore << EOF
|
||||
hello
|
||||
*.o
|
||||
*.h
|
||||
EOF
|
||||
```
|
||||
|
||||
忽略语法
|
||||
```text
|
||||
# 这是注释行 —— 被忽略
|
||||
*.a # 忽略所有以 .a 为扩展名的文件。
|
||||
!lib.a # 但是 lib.a 文件或者目录不要忽略,即使前面设置了对 *.a 的忽略。
|
||||
/TODO # 只忽略根目录下的 TODO 文件,子目录的 TODO 文件不忽略。
|
||||
build/ # 忽略所有 build/ 目录下的文件。
|
||||
doc/*.txt # 忽略文件如 doc/notes.txt,但是文件如 doc/server/arch.txt 不被忽略。
|
||||
```
|
||||
|
||||
### 2.7.9 Git Archive
|
||||
|
||||
```bash
|
||||
git archive -o latest.zip HEAD # 根据最新的提交创建zip
|
||||
git archive -o latest.zip HEAD src doc # 只将目录src doc放入zip中
|
||||
git archive --format=tar --prefix=1.0/ v1.0 | gzip > foo-1.0.tar.gz
|
||||
```
|
||||
|
||||
|
||||
|
152
notes/2.8-git-gui.md
Normal file
152
notes/2.8-git-gui.md
Normal file
@ -0,0 +1,152 @@
|
||||
## git UI
|
||||
|
||||
### 2.8.4 git rev-parse
|
||||
|
||||
```bash
|
||||
git rev-parse --symbolic --branches # 显示分支
|
||||
git rev-parse --symbolic --tags # 显示里程碑
|
||||
git rev-parse --symbolic --glob=refs/* # 显示所有的引用
|
||||
```
|
||||
|
||||
`git rev-parse`可以将一个Git对象表达式表示为对应的SHA1哈希值
|
||||
|
||||
tag也分为两种,lightweighted tag和annotated tag
|
||||
|
||||
```bash
|
||||
git tag <tagname> # lighteweighted tag
|
||||
git tag -a <tagname> -m <message> # annotated tag
|
||||
```
|
||||
两种的区别在于轻量标签只会有commit对象
|
||||
标记标签会自己生成一个对象,然后指向commit对象
|
||||
|
||||
所以下面的内容中,`git rev-parse`指令的参数A和A^0是不同的哈希
|
||||
|
||||
```bash
|
||||
git rev-parse master refs/heads/master # 显示多个哈希
|
||||
git rev-parse A refs/tags/A
|
||||
git rev-parse A^{} A^0 A^{commit}
|
||||
git rev-parse A^3 # ~<n> = <n> ^
|
||||
```
|
||||
|
||||
### git rm / git add -u / git rm --cached
|
||||
|
||||
`git rm`会执行两个指令:
|
||||
1. 删除文件(工作区中的)
|
||||
2. 添加删除操作到暂存区
|
||||
3. 有一个前提是文件必须已经被git所跟踪
|
||||
|
||||
`git add -u`是将工作区的已经被git跟踪的文件添加到暂存区,包括修改和删除
|
||||
|
||||
`git rm --cached`是将暂存区的移除出来,也就是让**Git停止跟踪文件**。也就是说如果文件之前已经在commit中,无论文件是否被修改,使用这个指令都能让Git停止跟踪文件
|
||||
|
||||
### 2.8.4.2 git rev-list
|
||||
|
||||
作用主要是研究不同版本之间的范围,主要就是哈希值
|
||||
|
||||
```bash
|
||||
git rev-list --oneline A
|
||||
git rev-list --oneline D F # 使用两个tag的并集
|
||||
git rev-list --oneline ^G D # 排除这个版本和历史版本 等价于
|
||||
git rev-list --oneline G..D # 连接两个版本
|
||||
git rev-list --oneline B...C # 两个版本共同能够访问的除外
|
||||
git rev-list --oneline B^@ # 提交的历史提交,自身除外
|
||||
git rev-list --oneline B^! # 只看提交本身
|
||||
```
|
||||
|
||||
### 2.8.4.3 git log
|
||||
|
||||
显示提交历史
|
||||
|
||||
参数代表版本范围
|
||||
|
||||
```bash
|
||||
git log --oneline F^! D
|
||||
```
|
||||
**graph show**
|
||||
```bash
|
||||
git config alias.glog "log --graph"# 用别名
|
||||
git glog --oneline
|
||||
```
|
||||
|
||||
显示最近几条
|
||||
```bash
|
||||
git log -3 --pretty=oneline
|
||||
```
|
||||
|
||||
显示提交的具体改动
|
||||
```bash
|
||||
git log -p -1
|
||||
```
|
||||
|
||||
显示变更概要
|
||||
```bash
|
||||
git log --stat --oneline I..C #显示版本I到C的变更概要
|
||||
```
|
||||
|
||||
显示参数
|
||||
```bash
|
||||
git log --pretty=raw -1 # 显示提交的原始数据,
|
||||
git log --pretty=fuller -1 # 显示作者和提交者
|
||||
git log --pretty=oneline # 提供最精简的日志输出
|
||||
```
|
||||
|
||||
只是查看,分析某一次的提交,可以使用`git show`或者是`git cat-file`命令
|
||||
```bash
|
||||
git show D --stat # 展示里程碑D及其提交
|
||||
git cat-file -p D^0 # 展示里程碑D及其提交
|
||||
```
|
||||
|
||||
### 2.8.4.4 git diff
|
||||
|
||||
```bash
|
||||
git diff B A # 比较B和A里程碑
|
||||
git diff A # 比较工作区和里程碑A
|
||||
git diff --cached A
|
||||
git diff
|
||||
git diff --cached
|
||||
git diff HEAD
|
||||
```
|
||||
|
||||
```bash
|
||||
git diff --word-diff
|
||||
```
|
||||
|
||||
### 2.8.4.5 git blame
|
||||
|
||||
可以追溯指出是谁在什么时候,什么版本引入的代码
|
||||
|
||||
```
|
||||
git blame <filename>
|
||||
git blame -L <n,m> <filename> # 查看某几行
|
||||
```
|
||||
|
||||
### 2.8.4.6 git bisect
|
||||
|
||||
用于二分查找什么时候引入的代码
|
||||
```bash
|
||||
git bisect start # 开始二分查找
|
||||
git bisect bad # 设置当前版本为坏版本
|
||||
git bisect good G # 设置里程碑G为好版本
|
||||
git bisect reset # 结束
|
||||
```
|
||||
|
||||
标记错误,恢复
|
||||
```bash
|
||||
git bisect log > logfile # 打开logfile,删除标记错误的行
|
||||
git bisect reset
|
||||
git bisect replay logfile # 用logfile恢复进度
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
51
notes/2.9-change_history.md
Normal file
51
notes/2.9-change_history.md
Normal file
@ -0,0 +1,51 @@
|
||||
## 2.9 改变历史
|
||||
|
||||
### 2.9.1 悔棋
|
||||
|
||||
`git commit --amend -m` 会将当前的暂存区(staging area)中的更改与上一次的提交合并为一个新的提交,同时允许你修改提交信息。
|
||||
|
||||
```bash
|
||||
git commit -amend -m "message" # 修改上次提交的message
|
||||
```
|
||||
|
||||
添加一个误删的文件
|
||||
```bash
|
||||
git checkout HEAD^ -- <filename> # 从上次的提交恢复文件
|
||||
git status
|
||||
git commit --amend -m "message" # 将当前的修改添加到上次的提交中
|
||||
```
|
||||
|
||||
### 2.9.2 多步悔棋
|
||||
|
||||
想要将最近的两个提交压缩为一个,并把提交说明改为“modify hello.h”,可以使用如下方法进行操作。
|
||||
|
||||
```bash
|
||||
git reset --soft HEAD^^ # 重置到两次提交之前
|
||||
git status
|
||||
git commit -m "modify hello.h"
|
||||
```
|
||||
|
||||
### 2.9.3 回到未来 git rebase
|
||||
|
||||
|
||||
```bash
|
||||
git cherry-pick # 从众多的提交中挑选出一个提交应用在当前的工作分支中
|
||||
```
|
||||
|
||||
去掉某个commit
|
||||
```bash
|
||||
git checkout <commit> # 先切换到某次提交
|
||||
git cherry-pick <commit> # 输入之后的提交
|
||||
git checkout <branch> # 再切换回来
|
||||
```
|
||||
|
||||
合并两次commit
|
||||
```bash
|
||||
git checkout [<tag>|<commit>]
|
||||
git reset --soft HEAD^^ # 向前移动两次
|
||||
git commit -C C # 提交,重用C提交的提交说明
|
||||
git cherry-pick E
|
||||
git cherry-pick F
|
||||
```
|
||||
|
||||
|
14
notes/3.1_git_protocal.md
Normal file
14
notes/3.1_git_protocal.md
Normal file
@ -0,0 +1,14 @@
|
||||
## 3.1 Git Protocal
|
||||
|
||||
### 3.1.2
|
||||
|
||||
一般情况下,推送只允许“快进式”推送。
|
||||
|
||||
所谓快进式推送,就是要推送的本地版本库的提交是建立在**远程版本库相应分支的现有提交**基础上的,即远程版本库相应分支的最新提交是本地版本库最新提交的祖先提交。
|
||||
|
||||
```bash
|
||||
git rev-list HEAD # 查看最新提交和历史提交
|
||||
git ls-remote origin # 显示远程版本库引用对应的哈希值
|
||||
```
|
||||
|
||||
|
60
notes/3.2_resolve_conflict.md
Normal file
60
notes/3.2_resolve_conflict.md
Normal file
@ -0,0 +1,60 @@
|
||||
## 3.2 resolve conflict
|
||||
|
||||
### 3.2.1 拉回操作中的合并
|
||||
|
||||
pull操作的第一阶段,将共享版本库master分支的最新提交拉回到本地,并且更新到本地版本库特定的引用。
|
||||
|
||||
第二阶段,将本地分支master和共享版本库的本地跟踪分支origin/master进行合并操作。
|
||||
|
||||
push操作,是将本地提交推送到共享版本库中。
|
||||
|
||||
`git pull = git fetch + git merge`
|
||||
|
||||
```bash
|
||||
git merge [option...] <commit>...
|
||||
```
|
||||
|
||||
### 3.2.2 自动合并
|
||||
|
||||
多个用户修改了不同的文件/相同文件的不同部分,可以自动merge
|
||||
|
||||
1. 多个用户修改了不同的文件
|
||||
2. 相同文件的不同部分(开头,结尾)
|
||||
3. A用户移动文件,B用户编辑文件,自动merge会把编辑好的文件移动到对应位置
|
||||
|
||||
```bash
|
||||
git fetch
|
||||
git merge origin/master # origin/master就是共享版本库的本地分支
|
||||
git push
|
||||
```
|
||||
|
||||
### 3.2.3 逻辑冲突
|
||||
|
||||
存在逻辑冲突,需要在合并后进行单元测试
|
||||
|
||||
### 3.2.4 冲突解决
|
||||
|
||||
git pull以后会提示冲突文件,如果忘记了用git status也可以
|
||||
|
||||
git会自动把冲突的位置用七个<和七个=以及七个>标记出来,将他们删除掉,修改成想要的代码,就可以merge了
|
||||
|
||||
```bash
|
||||
git log --oneline --graph -3
|
||||
```
|
||||
|
||||
### 3.2.5 树冲突
|
||||
|
||||
文件处于不同状态,比如一个用户改名,另一个用户改成不同名字
|
||||
|
||||
```bash
|
||||
git rm readme.txt
|
||||
git rm doc/README.txt
|
||||
git add README
|
||||
```
|
||||
|
||||
本质上就是删除掉其他两个,留下来一个想要的
|
||||
|
||||
|
||||
|
||||
|
||||
|
59
notes/3.3-git_touch.md
Normal file
59
notes/3.3-git_touch.md
Normal file
@ -0,0 +1,59 @@
|
||||
## 3.3 git 里程碑
|
||||
|
||||
### 3.3.1 显示里程碑
|
||||
|
||||
```bash
|
||||
git tag # 显示里程碑
|
||||
git tag -n1 # 显示1行里程碑的说明
|
||||
git tag -l jx/v2* # 使用过滤器
|
||||
```
|
||||
|
||||
```bash
|
||||
git log --oneline --decorate # 查看提交对应的里程碑以及其他引用
|
||||
```
|
||||
|
||||
```bash
|
||||
git describe # 显示<tag>-<num-g<commit> <tag> name <num> commit num <commit> commit
|
||||
```
|
||||
|
||||
```bash
|
||||
git name-rev HEAD # 显示提交ID和其对应的一个引用 这里是HEAD和master
|
||||
```
|
||||
|
||||
### 3.3.2 创建里程碑
|
||||
|
||||
```bash
|
||||
git tag <tagname> [<commit>] # 轻量级里程碑
|
||||
git tag -a <tagname> [<commit>]
|
||||
git tag -m <msg> <tagname> [<commit>] # 带说明的里程碑
|
||||
git tag -s <tagname> [<commit>]
|
||||
git tag -u <key-id> <tagname> [<commit>] # 带GPG签名的里程碑
|
||||
```
|
||||
|
||||
### 3.3.3 删除里程碑
|
||||
|
||||
```bash
|
||||
git tag -d
|
||||
```
|
||||
|
||||
### 3.3.4 不要更改里程
|
||||
|
||||
### 3.3.5 共享里程碑
|
||||
|
||||
```bash
|
||||
git ls-remote origin my* # 查看以my开头的里程碑
|
||||
```
|
||||
|
||||
```bash
|
||||
git push origin mytag # 推送mytag到远端
|
||||
git push origin refs/tags/* # 推送本地建立的所有里程碑
|
||||
```
|
||||
|
||||
### 3.3.6 删除远端里程碑
|
||||
|
||||
```bash
|
||||
git tag -d <tagname>
|
||||
git push origin :<tagname>
|
||||
```
|
||||
|
||||
|
27
src/Makefile
Normal file
27
src/Makefile
Normal file
@ -0,0 +1,27 @@
|
||||
OBJECTS = main.o
|
||||
TARGET = hello
|
||||
|
||||
all: $(TARGET)
|
||||
|
||||
$(TARGET): $(OBJECTS)
|
||||
$(CC) -o $@ $^
|
||||
|
||||
main.o: | new_header
|
||||
main.o: version.h
|
||||
|
||||
new_header:
|
||||
@sed -e "s/<version>/$$(git describe)/g" \
|
||||
<version.h.in> version.h.tmp
|
||||
@if diff -q version.h.tmp version.h > /dev/null 2>&1; \
|
||||
then \
|
||||
rm version.h.tmp; \
|
||||
else \
|
||||
echo "version.h.in => version.h" ; \
|
||||
mv version.h.tmp version.h;\
|
||||
fi
|
||||
|
||||
clean:
|
||||
rm -f $(TARGET) $(OBJECTS) version.h
|
||||
|
||||
.PHONY: all clean
|
||||
|
8
src/main.c
Normal file
8
src/main.c
Normal file
@ -0,0 +1,8 @@
|
||||
#include "version.h"
|
||||
#include <stdio.h>
|
||||
|
||||
int main(){
|
||||
printf("Hello, world. \n");
|
||||
printf("version: %s. \n", _VERSION);
|
||||
return 0;
|
||||
}
|
6
src/version.h.in
Normal file
6
src/version.h.in
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef HELLO_WORLD_VERSION_H
|
||||
#define HELLO_WORLD_VERSION_H
|
||||
|
||||
#define _VERSION "<version>"
|
||||
|
||||
#endif
|
1
welcome.txt
Normal file
1
welcome.txt
Normal file
@ -0,0 +1 @@
|
||||
Hello world
|
Loading…
Reference in New Issue
Block a user