Git 常见操作
wangjing013 opened this issue · comments
常用操作
- 分支-create
- 合并-merge
- 合并-rebase
- 暂存-stash
- 拣取-cherry-pick
- 日志-log
- 回滚-reset
- 修改- commit message
- 如何保存 Git 用户名和密码
- Git remote
分支管理
- 创建分支
// 默认会基于当前所处分支进行创建,比如本地当前分支是 master , 那么 feat_branch 基于 master 创建的
git checkout -b feat_branch
// 指定基于远程分支创建
git checkout -b feat_branch origin/master
git checkout -b feat_branch origin/dev
git checkout -b feat_branch origin/fat
- 推送分支到远程
git push --set-upstream origin feat_branch
- 切换分支
git checkout branch_name
- 删除分支
// 删除本地分支
git branch -D feat_branch
// 删除远程分支
git push origin --delete feat_branch
git merge
git checkout master
git merge feat_branch
git rebase
下面通过一个具体的案例:
- 现在基于
master
创建一个新的分支feat_base
、开发过程中发现线上问题紧急修复, 则创建hotfix
分支, 如下:
hotfix
完成后合并到master
并完成上线操作. 继续切回feat_base
进行开发.
- 现在
feat_base
也开发完成, 通过git rebase
完成变基操作.
// 执行如下命令
git checkout feat_base
git rebase master
git rebase 主要做了几件事:
- 找到
feat_base
和master
的共同祖先元素 - 对比当前分支
feat_base
相对于该祖先```C3``的历次提交,提取相应的修改并存为临时文件. - 将当前分支指向目标基底
C4
, 最后以此将之前另存为临时文件的修改依序应用.
- 现在切换
master
进行一次快进合并
git checkout master
git merge feat_base
rebase 应该遵守原则
不要对在你的仓库外有副本的分支执行变基.
变基操作的实质是丢弃一些现有的提交, 然后相应地新建一些内容一样但实际上不同的提交.
rebase vs merge
总的原则是, 只对尚未推送或分享给别人的本地修改执行变基操作清理历史, 从不对已推送至别处的提交执行变 基操作, 这样, 你才能享受到两种方式带来的便利
暂存
当接收到新需求时, 通常步骤就是切换新的分支在这个功能分支上进行开发. 有时忘记该操作就直接在当前分支(例如 master)上进行修改, 遇到这样情况怎么处理? 可以使用 git stash
功能.
// 当前分支 master
git stash // 暂存
// 切换到其它分支, 重新应用
git checkout feat_branch
git stash pop
// 其它命令
git stash list // 查询当前项目中存贮的stash列表(上面会有是在哪个分支上保存的代码,很清晰的呦)
git stash apply [stash@{0}] // 重新获取之前保存的代码,可以在另外的分支, 也可以在同一分支([]中括号内为可选参数,需要获取第几次的保存,默认为全部,注:会保留之前的stash列表)
git stash pop [stash@{0}] // 作用同上,区别是: 1> 中括号内的参数可选,默认为获取第一次 2> 不会保留stash列表
git stash show -p [stash@{0}] | git apply -R // 可用来还原获取保存代码之前的状态。中括号内默认为第一条。只用用apply获取的才可以还原的呦
git stash drop [stash@{0}] // 删除stash记录,默认删除第一条
git stash clear // 清空所有stash记录
拣取特定内容
有时我们并行开发多个版本, 比如 V2.0
和 V3.0
, 现在 V3.0
分支上有几个特色功能, 现在想把这部分添加到V2.0
版本中, 怎么做呢? git cherry-pick
- 先查看
V3.0
上的 commit 记录
git checkout V3.0
git log
日志如下:
commit 44ae486dbb8bcf5aa984d21783995115f57ff9b4 (HEAD -> feat_combo, origin/feat_combo, origin/ch_goodsCenter, ch_goodsCenter)
Author: wjJSBlog <974742841@qq.com>
Date: Mon May 17 16:24:23 2021 +0800
feat: 修改视频课展示问题
commit 088089ff10f357697b578cce3f7bd3d971d936c1
Author: wjJSBlog <974742841@qq.com>
Date: Mon May 17 15:50:52 2021 +0800
feat: 套餐课数量修改
- 切换
V2.0
// 切记活动
git checkout V2.0
// 拣取
git cherry-pick 44ae486dbb8bcf5aa984d21783995115f57ff9b4 088089ff10f357697b578cce3f7bd3d971d936c1
// 提交
git push
查看某个文件更新日志
- 查看某个文件的commit记录
git log filename
- 查看文件每次提交的diff
git log -p filename // 查看文件每次提交的diff
- 列出文件的所有改动历史
git log --pretty=oneline filename // 列出文件的所有改动历史
- 只查看某次提交的文件变化
git show 提交生成的一次哈希值 filename // 只查看某次提交的文件变化
回滚
分支进行回滚操作
- 切换分支
git checkout master
基于 tag 回滚
- 查看 tag
// 显示tag列表
git tag
// 查看具体tag的 commmit id
git show xxtag_name
- 通过 commit id 回滚到特定的版本
git reset --hard "commit id"
- 把分支提交远程
git push -f origin master
修改commit message
git commit --amend
如何保存 Git 用户名和密码
- 重置Git账号
git config --system --unset credential.helper
How to reset git authentication?
- 保存Git账号
git config --global credential.helper store
How can I save username and password in Git?
git remote
- 查看远程源
git remote -v
- 更改远程源
git remote set-url <remote_name> <remote_url>
git remote set-url origin https://git-repo/new-repository.git
- 更改远程源为 SSH
git remote set-url <remote_name> <ssh_remote_url>
git remote set-url origin git@github.com:user/repository.git