git保存数据的方式
- Git 不按照以上方式对待或保存数据。反之,Git 更像是把数据看作是对小型文件系统的一系列快照。 在 Git 中,每当你提交更新或保存项目状态时,它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。 为了效率,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个快照流
基础操作
1、检出代码的方式
- 直接检出分支:git checkout {featureName}
- 创建分支并检出:git checkout -b {featureName} {sourceFeatureName}
2、将远端代码拉到本地
git pull:配置rebase / merge
- 将代码拉到本地暂存区,然后与本地代码进行合并,通过git config配置合并方式(rabse / merge)
- 配置当前仓库:git config pull.rebase true (配置true,使用rebase合并,配置false使用merge合并)
- 配置全局:git config --global pull.rebase true
git fetch origin
- 会在本地生成master分支,跟踪 远程分支origin/master
- 如果远程代码与本地代码有冲突,那么git fetch不会拉取代码,反之则会
设置远端和本地的连接(本地仓库跟踪远程仓库)
- 为什么做连接: pull(or push) 需要指定pull(or push)的来源(or 目的地)
- 如何创建链接:git branch --set-upstream = origin/{featureName}
代码更新方式
- 单分支
- 添加测试环境代码更新
MR:merge request:比较简单,忽略
PR: pull request
代码pull下来之后,分别执行 git status,git remote -v
// 说明:本地仓库的master分支,他的远端是:origin/master(你的仓库) // 相当于执行过 : git branch --set-upstream=origin/master ➜ stock git:(master) git status On branch master Your branch is up to date with 'origin/master'. ➜ stock git:(master) git remote -v origin git@github.com:xxx/xxx.git (fetch) origin git@github.com:xxx/xxx.git (push)
保证自身远端仓库与原仓库数据统一
- 设置原始仓库别名:upstream(不要与--set-upstream= 操作混淆,--set-upstream表示是远端)
- git remote add upstream git@github.com:xxx/xxx.git
- 分别执行 git status,git remote -v 操作
➜ stock git:(master) git status On branch master Your branch is up to date with 'origin/master'. ➜ stock git:(master) git remote -v origin git@github.com:fcksw/stock.git (fetch) origin git@github.com:fcksw/stock.git (push) upstream git@github.com:myhhub/stock.git (fetch) upstream git@github.com:myhhub/stock.git (push)
本地仓库结构--stash
- 应用stash: 可以将当前写完但没提交的代应用到其他分支 或者 当你在开发的时候,但是不想提交,这时需要切换到其他分支查问题;
- 使用stash: git stash save ${statshName}
查看stash内容:git stash list
stash@{0}: On test-20241204: test
- 应用后删除stash:git stash pop stash@{0}
- 应用后不删除stash:git stash apply stash@{0}
常见问题以及解决方案
如何将feature1提交的代码转换到feature2上
cherry-pick
- git log 查看所有已提交代码。
- git log show 查看具体内容
- 切换到目标分支,使用git cherry-pick ${commitId}
- 执行完成后,如果无冲突,那么会直接合并,生成新的提交;如果有冲突,会将数据放入默认的暂存区,手动修复冲突,然后手动提交
reset
- git reset --hard 强制将本地代码置为某个版本:每个version都是全部代码的快照
git reset --soft 此时可能会产生很多 untrack的信息,它来源于远端的未被add 的文件,需要clean
1、删除当前目录下untrack文件,不包括文件夹和.gitignore中指定的文件和文件夹 git clean -f 2、删除当前目录下untrack文件和文件夹, 不包括.gitignore中指定的文件和文件夹 git clean -df 3、删除当前目录下的所有untrack的文件和文件夹 git clean -xdf 4、显示会被删除的文件 git clean -nxfdgit clean -nfgit clean -nfd
rebase与merge
merge
D---E test / A---B---C---F master
rebase
- git rebase ${featureName}
- git pull --rebase ${featureName}
- rebase黄金法则:永远不要在公共分支上使用它
使用rebase提交后的git tree
合并、修改提交
修改最近一次的提交信息
git commit --amend
- 最近三次的提交记录:git rebase -i HEAD~3
- 从指定的commit到最新的commit:git rebase -i ${commitId}
- 指定两个commit以及他们中间:git rebase -i ${startCommit} ${endCommit}
- 基本指令: edit 指令需要配合 git commit --amend 使用;
- 被edit修饰的提交会在rebase过程中停止,此时被edit修饰的提交就是最新的提交,使用git commit --amend来修改最新的提交信息以及当时的代码,完成后,使用git rebase --continue
p 或 pick 使用该commit,不做修改(默认指令)
r 或 reword 使用该commit,但是修改它的commit信息
e 或 edit 使用该commit,但是要停下来修改(commit信息和提交内容)
s 或 squash 使用该commit,但是将此条commit融入之前的commit
f 或 fixup 跟squash一致,跟前一条commit合并,但是丢弃该commit的日志消息
x 或 exec 运行shell命令(该行的其余部分)
b 或 break 到此为止(稍后继续使用 'git rebase --continue' 进行rebase)
d 或 drop 丢弃该commit
l 或 label 使用label标记当前HEAD
t 或 reset 将HEAD重置到label标记
m 或 merge [-C <commit> | -c <commit>] <label> [# <oneline>]
使用原始合并提交的消息(或单行,如果未指定原始合并提交)创建合并提交。
使用 -c <commit> 改写提交消息。
新添加进ignore文件的路径未被忽略的解决方案
- 原因是:.gitignore 只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的
那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交
git rm -r --cached . //将所有文件都变成unTrack状态 git add . // 将所有文件 + ignore文件同时加入 track状态 git commit -m 'update .gitignore' //提交,ignore生效
或者 如果想要忽略已检入的文件,则必须在添加忽略该文件的规则之前取消跟踪它
git rm --cached FILENAME
revert
- 执行过程
思考问题:a,b文件是否会被提交
- 文件a,b是先创建在提交,在删除,在提交; commit's logs 中包含b,d两次提交,然后是F提交,G会从commit log中判断b,d两次提交已经在其中,所以不会继续执行merge操作
- 解决方案
cherry-pick(推荐)
- 在master分支的基础上,创建新的分支 newFeature,然后在newFeature上执行cherry-pick,执行完cherry-pick后,会在newFeature形成新的提交,但是内容与b、d提交的内容一致
- git cherry-pick ${commitId1} ${commitId2}
- 如果提交过多,可以使用 git rebase -i ${commitId} 来合并commit
git revert (不推荐)
- 方案1: 在prod分支操作(生产环境一般不允许操作),在prod分支找到之前revert的commit,将之前的revert再次进行revert
方案2: 在本地分支上操作
- 使用rebase操作,找到本次feature的所有git log,找到第一个commit,即将所有commmit合并成一个commit
- 完成后,执行 git rebase origin/master, 即将远端prod的提交全部加在feature分支的提交链条上
- 找到prod之心revert提交的那个commit,再次对他执行revert,表示抛弃这个revert,被删除的代码就回来了
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。