Git
Git 学习
Windows 初始化操作、基础操作
- 新建文件夹
- 进入文件夹,右击git bash here
| 1 | $ git init | 
基本配置
| 1 | $ git config --global user.name 'username' # 设置用户名 | 
基本操作
| 1 | # 提交操作 | 
| 1 | # 远程仓库 | 
| 1 | # 分支操作 | 
| 1 | # 推拉操作 | 
| 1 | # 其他操作 | 
菜鸟教程 - Git 基本操作:https://www.runoob.com/git/git-basic-operations.html
撤销
- 大写的 HEAD表示最近的一次commit
- HEAD~1中的- ~1表示之前一个,退回两个就- ~2,如此类推
撤销 git add 操作
- 从暂存区移出 - 1 
 2
 3- git reset <changed_file> 
 或
 git restore --stage <changed_file>- 该操作较为安全,只会把文件从 - 暂存区移出,不会对硬盘上的源文件进行修改
- 还原磁盘上的文件 - 1 - git checkout HEAD <changed_file> - 这个操作会丢失硬盘上的修改,需要注意! 
撤销 git commit 操作
- 撤销 - local git里的- commit- 1 - git reset --soft HEAD~1 - 硬盘里的文件不会变,文件的变化也会保留在暂存区里,只是这个 - commit被干掉了
- 同时撤销 - git commit和- git add- 1 
 2
 3- git reset HEAD~1 
 等价于
 git reset --mixed HEAD~1- 只保留硬盘里的文件,暂存区里的 - add,和 local git 里的- commit被干掉了
- 撤销文件的所有修改 - 1 - git reset --hard HEAD~1 - 硬盘里的文件,暂存区里的 - add,和 local git 里的- commit都被干掉- 文件完整恢复到初始的状态 - 虽然这个操作本身可以撤销,但直观上看文件就是被恢复到原来的状态的,需要找回甚是麻烦,使用时要颇为小心! 
通过 git revert 进行撤销
与 git reset 删除前一个 commit 不同的是,git revert 本质是增加一个 commit
这个新的 commit 的内容,是你之前 commit 的 -commit
Init —> +Change —> -Change —> Init
| 1 | git revert HEAD | 
也就是把前一个 commit
加 的内容变成 **减**,减 的内容变成 加
再 commit 放回到 git 里
reset 和 revert 的对比
- reset 只能回到之前某一个commit的状态,但revert可以撤销中间任意一个commit
Init —> +Change1 —> +Change2 —> -Change1 —> Change2
在使用了
git push之后,特别是在 公有分支 时,不能通过reset来删除分支中的commit,只能添加自己合进去的commit的-commit来撤销自己的操作
如果是 个人分支 ,可以使用 git reset 来撤销
| 1 | git reset --hard HEAD~1 | 
工作流
merge
merge有两种合并,一种是快进合并,另一种是三路合并
- 快速合并 - 当前工作分支到合并目标分支之间的提交历史是线性路径时,可以进行快进合并。 
- 三路合并 
merge是先寻找两个分支最近的公共祖先 merge base ,然后将该祖先与当前分支以及要合并的分支的差异应用到当前分支上
rebase
相当于把自己当前的commit先延后,先把其他的合在前面,然后再提交自己的commit
与直接merge不同
main 分支
| 1 | # feature分支: | 
可能触发rebase conflict
主分支:squash and merge
squash 把这个分支上的所有改变,合并成一个改变,然后把这个改变 merge 进去
stateDiagram
    [*] --> Main_Init
    Main_Init --> Main_Commit_1
    Main_Commit_1 --> Main_Commit_2
    Main_Commit_2 --> Main_Commit_3
    Main_Commit_1 --> feature: git checkout -b feature
    state feature {
        [*] --> feature_commit_1
        feature_commit_1 --> feature_commit_2
    }
    
    Main_Commit_3 --> ·
    feature --> · : git rebase main
    · --> Main_merge_commit: diff Main_Commit_1 & Main_Commit_3 & feature_commit_2
flowchart TB graph TB Main(main) Main2(main-commit-1) Main3(main-commit-2) Main4(main-commit-3) Main5(main-commit-merge) feature(feature) feature1(feature-commit-1) feature2(feature-commit-2) mergediff: 当前分支的头结点:main-commit-3 && 要合并的分支的头结点:feature-commit-2 && 最近的公共的祖先结点:main-commit-1 Main-->Main2 Main2-->Main3 Main3-->Main4 Main2-- git checkout -b feature -->feature feature-->feature1 feature1-->feature2 Main4 --git merge feature --> merge Main2 -.->merge feature2 --> merge merge --> Main5
Github
| 1 | # github.con | 


