前言
熟练的使用 git 指令,是一个程序员的基本功,本文记录了我这些年常用的一些 git 操作。
进入新团队需要做的一系列 git 操作
高频使用的指令
1. 注册内网 gitLab 账户 2. 项目管理员拉我进项目 3. 有了权限后,git clone 'url' 项目到本地 4. 自己创建新的项目分支 git branch '分支名' 5. 开始编码吧... 6. git clone 默认是下载了所有分支的代码 7. git branch -a 查看项目所有分支 8. git branch -r 查看项目所有远程分支 9. git checkout '分支名' 切换分支 10. git branch 打印出来所有的分支,以及当前所在分支 11. git log 查看提交记录,退出 英文状态下 Q 12. git reflog 可查看修改记录(包括git reset 的回退记录) 13. git reset --hard {commit id} 回退版本 14. git stash //代码放进暂存区(未被commit的代码) 15. git stash apply 还原 16. git stash drop 清除最近一次的stash记录 17. git stash pop 还原并清除最近一次 stash 18. git stash list 查看暂存列表 19. git stash clear 清空所有 stash 的记录 20. git remote -v 显示所有远程仓库 21. git remote add url 添加一个远程仓库 22. git remote rm name # 删除远程仓库 23. git remote rename old_name new_name # 修改仓库名
git 文件名大小写问题
踩了git的坑!!
在 windows下,一开始提交了一个 login.less文件,后来把它重命名为 Login.less,居然提交不了,git 提示没有改动,后来才知道,原来git默认对文件名的大小写不敏感。
如何解决git文件名大小写问题?
方案1,配置 git
首先可以通过配置git来达到识别文件名大小写的问题。命令如下:
git config core.ignorecase false
缺点是每个仓库都需要修改。
方案2,手动修改
- 首先删除存储在git本地仓库的目标文件,以 Login.less 为例:
git rm Login.less 或者 git rm -f Login.less -f 表示强制删除。
- 修改文件名
- 添加文件到本地仓库 git add .
- 提交到本地仓库及远程仓库
git commit -m 'rename file'; git push
git merge 冲突后恢复到合并前状态
git merge --abort // 回滚到合并之前 第二种方案: git stash git stash clear
修改 git 仓库的提交用户名和邮箱地址
// 查看 git config user.name git config user.email // 全局仓库 git config --global user.name "yourName" git config --glocal uer.email "yourEmail" // 单个仓库 git config user.name "yourName" git config user.email "yourEmail"
取消 Git 对某文件的跟踪 (示: development.env.js)
git update-index --assume-unchanged config/development.env.js 可以忽略文件 git checkout .\config\development.env.js git update-index --no-assume-unchanged .\config\development.env.js 可以取消忽略文件
版本回退
解决方法
1、运行git reflog 命令查看你的历史变更记录,如下:
fdb70fe HEAD@{0}: pull origin newpbft: Fast-forward 40a9a83 HEAD@{1}: checkout: moving from guan to master b3fa4c3 HEAD@{2}: commit: copy from newpbft, first init 71bf0ec HEAD@{3}: checkout: moving from newpbft to guan 71bf0ec HEAD@{4}: commit: 1. add moveStore() to clean up certStore and blockStore. 1006d67 HEAD@{5}: commit: 1. Add PBFT branch to Puppeth. fa3fb56 HEAD@{6}: commit: 1. change some errors about packages and vars 5f40fdc HEAD@{7}: checkout: moving from master to newpbft 40a9a83 HEAD@{8}: clone: from https://github.com/yeongchingtarn/geth-pbft.git
2、然后用 git reset --hard HEAD@{n},(n是你要回退到的引用位置)回退;比如上图可运行 git reset --hard 40a9a83
git reset 与 git revert 的区别? git reset --hard {commitHashId} // 回退到某一个版本 git revert -n {commitHashId} // 回退某一个 commit, 会生成一个新的版本,反转覆盖掉原来的提交代码
注意:关于版本回退记录!!
一个commit对应这一个版本,有一个commit id,40位的16进制数字,通过SHA1计算得到,不同的文件计算出来的SHA1值不同(有很小的几率相同,可忽略),这样每一个提交都有其独特的id。每提交一个新版本,实际上 Git 就会把它们自动串成一条时间线。
在Git中,HEAD 表示当前版本,也就是e620a6ff0940a8dff…,HEAD^ 表示上一个版本,HEAD^^ 表示上上一个版本,往上100个版本可以写成HEAD加连续100个 ^ ,也可以写成:HEAD~100
拉取远程分支
// 拉取远程分支并建立本地分支,但不会自动切换到此本地分支 git fetch origin 远程分支名x:本地分支名x git checkout -b 本地分支名 origin/远程分支名
分支合并
git merge a 将 a 分支合并到当前分支 注意事项: 合并分支需要先更新本地分支代码,然后将本地分支1合并到本地分支2,不能直接合并远程分支1到本地分支2
暂存区
当你需要紧急切换到主分支,执行紧急任务的时候,可以使用
git stash // 当前分支代码加入暂存区 git stash list // 查看暂存记录id git stash apply // 还原 git stash drop 删除最后一条暂存区信息
修改分支名(重命名)
git branch -m oldName newName
删除本地分支和远程分支
1. git branch -d '分支名' 2. git branch -D '分支名' //强制删除 3. git push origin --delete '分支名' // 删除远程分支
新建本地分支及远程分支
- git branch '分支名' //本地新建分支
- git fetch origin b1:b2 // 从远程拉取分支 b1 的代码到 本地并新建b2分支
查看和修改本地分支和远程分支 关联情况
git remote -v // 查看git对应的远程仓库地址 git remote rm origin // 删除关联对应的远程仓库地址 git remote -v // 查看是否删除成功,如果没有任何返回结果,表示OK git remote add origin https://github.com/developers-youcong/Metronic_Template.git // 重新关联git远程仓库地址
git cherry-pick (摘樱桃)
使用场景:
- 代码 commit 到错误的分支
- 转移另一个代码库的提交A
在当前分支重新复制提交一份改commit 的代码,生成新的 commitHash -x 配置项 在提交信息的末尾追加一行(cherry picked from commit ...),方便以后查到这个提交是如何产生的。 git cherry-pick {commitHashId}
git rebase 和 git merge
rebase 翻译为变基,他的作用和 merge 很相似,用于把一个分支的修改合并到当前分支上, 不同于 git rebase的是,git merge 在不是 fast-forward(快速合并)的情况下,会产生一条额外的合并记录,类似Merge branch 'xxx' into 'xxx'的一条提交信息。