基本概念
文件状态
在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" orginal_owner="Arronlong" # 把forked repo先clone到本地 git clone [email protected]:lava-lake/${project_name} # py_scripts was cloned from Arronlong/py_scripts cd ${project_name} git remote add upstream [email protected]:${orginal_owner}/${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