cha0s32 / cha0s32.github.io

0 stars 0 forks source link

Git从入门到实操 #2

Open cha0s32 opened 9 months ago

cha0s32 commented 9 months ago

Git 基础

创建版本库

git init 

添加及提交到仓库

git add xxx.file
git commit -m "xxxx"

## 看看工作区和暂存区的区别
git diff xxx.file

版本回退

# 查看最近三次commit 记录

git log --pretty=oneline

HEAD 表示当前版本, HEAD^ 表示上一个版本, HEAD~100表示前100个版本

git reset --hard HEAD^ # 回退到上一个版本

Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向指定版本

想从旧版本恢复到新版本,但是新版本的commit idgit log找不到了:

git reflog

可以看到每一步HEAD指针的变更记录,从而找到新版本的commit id

git reset --hard commit_id

撤销修改

git checkout -- file_name

如果修改已经提交到暂存区了,使用git reset HEAD file_name可以把暂存区的修改撤销掉,重新放回工作区

然后再git reset -- file_name把工作区的文件还原

远程仓库

第一步,在 github上创建远程仓库

本地文件夹关联远程仓库 (origin也可以改成其他的)

git remote add origin git@github.com:cha0s32/xxx.git

第一次把本地内容推送到远程仓库

git push -u origin master # -u 会把本地master分支和远程master分支关联起来

查看远程库信息

git remote -v

接触远程库和本地的绑定关系

git remote rm 远程库的名字

从远程库上克隆项目

# ssh

git clone git@github.com:cha0s32/xxx.git

# https
https://github.com/cha0s32/xxx.git # 比较慢

分支管理

创建与合并分支

git checkout -b dev # 创建名为dev的分支,并切换过去
# git switch -c dev

改动 dev 分支的文件,然后提交

git add .
git commit -m "a new branch"

切换回master分支

git branch master # git switch master

合并 dev 分支

git merge dev

删除 dev 分支

git branch -d dev

解决冲突

当两个分支同时改动同一个文件,并且都提交了以后,要 merge 需要手工解决冲突

新建新分支

git switch -c test

原 master 中有一个 readme 文件,内容为

aaaaaaaa
bbbbbbbb

且已提交

新分支中,也有readme文件,内容为

aaaaaaaaa
bbbbbbbba

也已提交,现打算在主分支用git merge合并,会出现冲突的提示,使用cat readme可以看到两个文件的区别

在主分支的readme中作改动,然后再次提交,解决冲突

git add .
git commit -m "conflict commit"

然后可以删掉 test分支

分支管理策略

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。

如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

简单得说,就不需要手动解决冲突了,直接生成新的commit

命令如下:

 git merge --no-ff -m "merge with no-ff" dev

Bug 分支

情况: 有 Bug 的情况下,要新建一个分支进行bug修复,但当前的工作还不能提交

先把当前工作现场存储起来

git stash

切换到需要改bug的分支,新建新分支

git checkout master
git checkout -b bug-1.0.1

修改bug,并提交(记住commit id,切换到开发的分支后可以将修改合并)

git add .
git commit -m "xxxx"

合并bug分支

git merge --no-ff -m "merge" bug-1.0.1

回到开发分支,恢复工作现场

git switch dev

git stash list
git stash pop # 恢复同时把stash删掉

/*
也可以这样
git stash apply
git stash drop
*/

# 恢复指定的stash
git stash apply stash@{0}

把前面bug修改复制到dev分支

git cherry-pick {bug-commit-id}

好用的github工作流

1. 三个部分

2. 流程

git clone repo_address
git  checkout -b my-feature

这个时候local git 上就存在两个分支,main branchmy-feature branch

3. 同步

如果此时发现main 直线里 多了一个 commit 名为 update

想要把 update 的commit 也同步到 branch 里面

4. Pull Request

my-feature的改动尝试合并在main分支里