Git

基本概念

文件状态

在Git中文件大概分为三种状态:已修改(modified)、已暂存(staged)、已提交(committed)

修改:Git可以感知到工作目录中哪些文件被修改了,然后把修改的文件加入到modified区域
暂存:通过add命令将工作目录中修改的文件提交到暂存区,等候被commit
提交:将暂存区文件commit至Git目录中永久保存

节点代称commit提交

在Git中每次提交都会生成一个节点,而每个节点都会有一个哈希值作为唯一标示,多次提交会形成一个线性节点链(不考虑merge的情况)
HEAD是Git中非常重要的一个概念,你可以称它为指针或者引用,它可以指向任意一个节点,并且指向的节点始终为当前工作目录,换句话说就是当前工作目录(也就是你所看到的代码)就是HEAD指向的节点。

分支

分支也是Git中相当重要的一个概念,当一个分支指向一个节点时,当前节点的内容即是该分支的内容,它的概念和HEAD非常接近同样也可以视为指针或引用,不同的是分支可以存在多个,而HEAD只有一个。通常会根据功能或版本建立不同的分支

rebase – 与 git merge最大的区别

就是rebase从branch发起,从master当中取diff,然后变成一个主线(branch+master都指向一个东西);merge是从master发起,合并branch中的diff,最后两个仍然并存。

merge相比于rebase有更明确的时间历史,而rebase会使提交更加线性应当优先使用

Add SSH Keys

Create Repo

Clone

# 如果已经在记录了ssh key的机器上用
git clone [email protected]:lava-lake/llpub.git
# 在随便一台机器上获得public repo
git clone https://github.com/lava-lake/llpub.git

Config User

git config --global user.email "[email protected]"

Add a new file & commit

# get a file to local folder
 touch test.txt   

# check status
 git status

# add file to stage/buffer 
 git add test.txt

# commit changes
 git commit -m 'add test.txt'

# push changes
 git push

Edit & commit

# change file
echo 'new line' >> test.txt

# check status
 git status

# add file to stage/buffer 
 git add test.txt

# commit changes
 git commit -m 'added new line to test.txt'

# push changes
 git push

修改过去某一特定节点的commit,不生成新节点

将HEAD分离出来指向节点有什么用呢?举个例子:如果开发过程发现之前的提交有问题,此时可以将HEAD指向对应的节点,修改完毕后再提交,此时你肯定不希望再生成一个新的节点,而你只需在提交时加上--amend即可,具体命令如下:

git commit --amend

更新远端修改

git stash
git pull
git stash pop
# 可能有conflict,如果想保持本地修改(比如config.php),只更新其他
git checkout --theirs -- config.php
# 只选了本地的config.php的部分

git fetch和pull的区别

rm

git rm file.txt
git rm -r folder
git commit -m 'rm a file & folder'
git push

国内机器使用Github的加速配置

Forked Repo怎么合并Original里面的更新

project_name="py_scripts"

# 把forked repo先clone到本地
git clone [email protected]ithub.com:lava-lake/${project_name}
# py_scripts was cloned from Arronlong/py_scripts
cd ${project_name}
git remote add upstream [email protected]:Arronlong/${project_name}
# 如果搞错了可以通过 git remote remove upstream 然后再 add

# 更新upstream里面的修改
git pull upstream main

# if any conflict,比如在actions-textnow.yml 当中;fix first, then
git add .github/workflows/actions-textnow.yml
git commit -m 'fix conflict on workflows/actions-textnow.yml'

# 再push回去
git push origin main

# done

Git当中使用本地http代理

git config --global http.proxy 'http://127.0.0.1:17890'
git config --list

Leave a Reply