Git & Github

奇技淫巧

本文最后更新于 <span id="expire-date"></span> 天前,文中部分描述可能已经过时。

命令行

cd 打印当前的路径

dir 打印当前路径下的文件

cls 清楚命令

cd .. 返回上级目录

echo <content> > <fileName>.<fileType> 创建文件

mkdir <fileName> 创建文件夹

rm <file> 删除文件

rmdir <dir> 删除文件夹

cd D: 切换到D磁盘

dir 现实当前目录所有文件夹

cd 相对路径/绝对路径

cd / 回到根目录

copy <file> <path> 将文件拷贝到path路径

move <file> <path> 将文件移动到path路径

git原理

Working Directory

.git(hidden): Staging Area (Index File), Commits (Objects Folder)

git init 创建git repository

git add <file> 添加文件

git rm <file> 删除文件

git commit -m <message> 提交文件

git status 查看状态

git add <file> 添加某一文件

git add . 添加所有文件

git log 查看日志

git ls-files 查看工作区文件

撤销commit:

  1. git reset --soft HEAD~<number> 撤销commit, 暂存区不变
  2. git reset HEAD~<number> 撤销commit,暂存区变化
  3. git reset --hard HEAD~<number> 撤销commit, 暂存区和工作区都变化

分支

git branch 查看分支

git branch <branchName> 创建分支

git switch <name> /git checkout <branchName> 切换分支

git switch -c <name> / git checkout -b <branchName> 创建并切换分支

git merge <name> 合并某分支到当前分支

git branch -d <branchName> 删除分支

git log --graph 分支合并图

若使用git checkout <id>回退到,会形成一个分离的head分支,可在这个分离的分支上做修改。若切换git switch master,则head分支会消失。此时可以,再用git checkout <branchName> <headId>创建一个内容和分离分支相同的分支,再git merge <branchName>合并到主分支

fast-forward用于主分支未作提交,git merge `

git merge --squash <branchName>

git merge --no-ff <branchName>

git rebase 和 git merge的区别

  • git rebase 和 git merge 都是用来合并分支的
  • 两者作用一样,但原理不同

假设有master和feature分支,在专用分支上开发新feature时,然后另一个团队在master分支提交了新的commits,若在master分支上的新提交与正在开发的feature相关,需要master分支将新提交的记录合并到feature分支,可以采用git merge或者git rebase 指令

git merge

1
2
git checkout feature
git merge master

git merge会在feature分支新增一个新的merge commit,然后将两个分支的历史联系在一起

  • merge是一种非破坏性的操作,对现有分支不会以任何方式被更改
  • feature分支每次需要合并上游更改时,都会产生一个额外的合并提交
  • 如果master提交非常活跃,可能会严重污染feature分支的历史记录,但可以用git log缓解

git rebase

1
2
git checkout feature 
git rebase master
  • rebase会将整个feature分支移动到master分支的顶端,从而有效地整合了所有master分支上的提交
  • merge提交方式不同,rebase通过为原始分支的每个提交创建全新的commits来重写项目历史记录,特点是仍然会在feature分支上形成线性提交
  • rebase的好处是可以获得清晰地项目历史,消除了git merge所需的不必要的合并提交,rebase还会产生完美线性的项目历史记录,可以在feature分支上没有任何分叉的情况下一直追寻到项目的初始提交

git merge 原理

在对特征分支进行rebase后,等效于创建了新的提交,并且老的提交没有被销毁,但不能简单地被访问或使用

注意点:

  1. 在重放之前的提交的时候,git会创建新的提交,即使重放的提交与之前的一模一样,git仍然会视之为新的提交进行处理
  2. git rebase并不会删除老的提交,也就是说对某个分支进行了rebase操作后,老的提交仍然存放在.git文件夹的objects目录下

如何取舍

  • get merge的优点是分支代码合并后不破坏原分支的代码提交记录,缺点是会产生额外的提交记录并进行两条分支的合并
  • git rebase优点是无须新增提交记录到目标分支,rebase后可以将对象分支的提交历史续上目标分支上,形成线性提交历史记录,进行review的时候更加直观

不能在一个共享的分支上进行Git rebase操作

回退修改

HEAD指向的版本就是当前版本

查看修改内容: git diff <file>

git reset . / git reset <fike> 撤销更改(已被add到暂存区)

git checkout . / git checkout <file> 撤销更改(未被add到暂存区)

git restore . / git restore <file> 撤销更改(未被add到暂存区)

git stash / git stash -m <message> 撤销更改(未被add到暂存区)

git stash apply 恢复更改

git stash list 查看更改列表

创建.gitignore, 可添加需要忽略的文件

例如

1
2
*.log //忽略所有log类型的文件
!test.log //除了test.log

git clean -dn 打印添加的但未被跟踪的文件

git reflog 查看命令历史(30天)

git reset --hard <commit_id/HEAD~n> 切换历史文件

查看文件: cat <file>

放弃工作区的修改: git checkout -- <file>

添加到暂存区,想放弃修改: git reset HEAD <file>

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;

在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

强行删除未合并过的分支: git branch -D <name>

  • 查看远程库信息: git remote -v

  • 从本地推送分支: git push origin <branch-name>,若推送失败先用git pull 抓取远程的新提交

  • 在本地创建和远程分支对应的分支: git checkout -b <branch-name> origin/<branch-name>

  • 建立本地分支和远程分支的关联: git branch --set-upstream <branch-name> origin/<branch-name>

  • 从远程抓取分支: `git pull

远程仓库

关联远程库: git remote add origin git@server-name:path/repo-name.git

第一次推送master分支: git push -u origin master

后续推送: git push origin master

克隆远程库: git clone <link>

  • `

标签管理

新建标签: git tag <tagname>(默认为HEAD,可指定一个commit id)

指定标签信息: git tag -a <tagname> -m "blabla……"

查看所有标签: git tag

推送一个本地标签: git push origin <tagname>

推送所有未推送过的标签: git push origin --tags

删除一个本地标签: git tag -d <tagname>

删除一个远程标签: git push origin :refs/tags/<tagname>

GitHub

local branch 与 remote branch之间通过 remote tracking branch(git branch -a进行查看)进行关联,本地与远程并没有直接联系

获取令牌

setting - Developer settings - Personal tokens - Generate new token

本地推送到Github

  1. 在GitHub建立一个仓库

  2. 在本地建议一个与仓库名的文件夹,用vs code 打开,进行增删改查文件

  3. 在终端git init,再进行git add .或者git add <filename>,并且git commit -m "blabla"

  4. git remote add origin <URL>

  5. git branch -M main,分支重命名(可选)

  6. 若上步未重命名,则git push origin master ,否则git push -u origin main

  7. 如果git push无效,则git push origin master

本文作者:Mosquito

本文链接: http://example.com/2022/06/06/Git%20&%20Github/

Mosquito 天使之吻手打

文章默认使用 CC BY-NC-SA 4.0 协议进行许可,使用时请注意遵守协议。