Open cha0s32 opened 9 months ago
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从指向指定版本
HEAD
想从旧版本恢复到新版本,但是新版本的commit id用git log找不到了:
commit id
git log
git reflog
可以看到每一步HEAD指针的变更记录,从而找到新版本的commit id
git reset --hard commit_id
git checkout -- file_name
如果修改已经提交到暂存区了,使用git reset HEAD file_name可以把暂存区的修改撤销掉,重新放回工作区
git reset HEAD file_name
然后再git reset -- 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可以看到两个文件的区别
git merge
cat readme
在主分支的readme中作改动,然后再次提交,解决冲突
readme
git add . git commit -m "conflict commit"
然后可以删掉 test分支
test
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
Fast forward
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
简单得说,就不需要手动解决冲突了,直接生成新的commit。
commit
命令如下:
git merge --no-ff -m "merge with no-ff" dev
情况: 有 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}
git clone repo_address
git checkout -b my-feature
这个时候local git 上就存在两个分支,main branch 和 my-feature branch
local git
main branch
my-feature branch
git diff
git add file-name
git commit
git push origin my-feature
github
my-feature
如果此时发现main 直线里 多了一个 commit 名为 update
想要把 update 的commit 也同步到 branch 里面
git checkout main
disk
init
git pull origin master
update
main
git checkout my-feature
git rebase main
rebase
commit conflict
git push -f origin my-feature
push
将 my-feature的改动尝试合并在main分支里
pull request
squash and merge
git branch -D my-feature
Git 基础
创建版本库
添加及提交到仓库
版本回退
HEAD 表示当前版本, HEAD^ 表示上一个版本, HEAD~100表示前100个版本
Git在内部有个指向当前版本的
HEAD
指针,当你回退版本的时候,Git仅仅是把HEAD从指向指定版本想从旧版本恢复到新版本,但是新版本的
commit id
用git log
找不到了:可以看到每一步HEAD指针的变更记录,从而找到新版本的
commit id
撤销修改
如果修改已经提交到暂存区了,使用
git reset HEAD file_name
可以把暂存区的修改撤销掉,重新放回工作区然后再
git reset -- file_name
把工作区的文件还原远程仓库
第一步,在 github上创建远程仓库
本地文件夹关联远程仓库 (origin也可以改成其他的)
第一次把本地内容推送到远程仓库
查看远程库信息
接触远程库和本地的绑定关系
从远程库上克隆项目
分支管理
创建与合并分支
改动 dev 分支的文件,然后提交
切换回master分支
合并 dev 分支
删除 dev 分支
解决冲突
当两个分支同时改动同一个文件,并且都提交了以后,要 merge 需要手工解决冲突
新建新分支
原 master 中有一个 readme 文件,内容为
且已提交
新分支中,也有readme文件,内容为
也已提交,现打算在主分支用
git merge
合并,会出现冲突的提示,使用cat readme
可以看到两个文件的区别在主分支的
readme
中作改动,然后再次提交,解决冲突然后可以删掉
test
分支分支管理策略
通常,合并分支时,如果可能,Git会用
Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用
Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。简单得说,就不需要手动解决冲突了,直接生成新的
commit
。命令如下:
Bug 分支
情况: 有 Bug 的情况下,要新建一个分支进行bug修复,但当前的工作还不能提交
先把当前工作现场存储起来
切换到需要改bug的分支,新建新分支
修改bug,并提交(记住commit id,切换到开发的分支后可以将修改合并)
合并bug分支
回到开发分支,恢复工作现场
把前面bug修改复制到dev分支
好用的github工作流
1. 三个部分
2. 流程
这个时候
local git
上就存在两个分支,main branch
和my-feature branch
git diff
看看硬盘上文件和git上保存的branch有什么区别git add file-name
将改动存在暂存区里,然后使用git commit
将代码提交到local git
上git push origin my-feature
, 此时github
项目上多了一个my-feature
分支3. 同步
如果此时发现main 直线里 多了一个 commit 名为 update
想要把 update 的commit 也同步到 branch 里面
git checkout main
, 将disk
的代码还原为init
的状态git pull origin master
, 把远端的update
同步到local git
的main
分支下git checkout my-feature
,切换回my-feature
分支git rebase main
,rebase
的意思是先把my-feature
对init
的改动先扔到一边,然后main
最新修改拿过来,最后把my-feature
修改尝试弄回去,有可能会出现commit conflict
,出现冲突要手动选择git push -f origin my-feature
, 把最新改动push
到github
上4. Pull Request
将
my-feature
的改动尝试合并在main
分支里pull request
squash and merge
,意思就是把其他分支的各种commit合并为一个改变,并把这个commit 放到 main branchgit checkout main
, 首先切换到 local git 的 main 分支下git branch -D my-feature
, 把 my-feature branch 从local git 上也删掉git pull origin master
, 把最新的更新拉到 local 的git 和 disk 上