Write by lyc at 2020-4-9 参考教程:《廖雪峰Git教程》 Update by lyc at 2022-2-24:重新学习
git 学习笔记2:增删改查 1.创建本地仓库与提交 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 cd ${Project_Name} && git init git init ${Project_Name} git add [file1] [file2] ... git add [dir] git add . git commit [file1] -m "${MESSAGE} " git commit -m "${MESSAGE} " git commit -az "${MESSAGE} " git commit --amend git rebase -i ${OLD_COMMID_ID}
查看当前仓库状态,比较文件区别
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 git status git status -s git diff id id git diff HEAD HEAD^ git diff HEAD HEAD^^ git diff HEAD HEAD~1 git diff HEAD HEAD~2 git diff HEAD -- readme.txt git diff --cached git diff git diff temp master git diff temp master -- index.html git diff commit_id commit_id
2.版本回退、回滚
GIT回退到指定版本的两种方法(reset/revert)
实现多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,以下总结了两种解决方法:reset
, revert
git log 确定回滚的版本 先使用 git log
来确定想要回滚到哪一个 commit 版本
1 2 3 4 5 6 7 8 9 git log git log --pretty=oneline git log --oneline git log -n2 git log -n2 --oneline git log --oneline --all git log --oneline --all --graph git log --graph --pretty=oneline --abbrev-commit
回滚之前,先来了解一下几个关于 HEAD
的关键字:
HEAD
当前版本
HEAD^
上一个版本
HEAD^^
上上一个版本
HEAD~100
上一百个版本
git reset 版本回退
该命令会强行覆盖当前版本和要回退的版本之间的其他版本(不太建议)。
1 2 3 git reset --hard HEAD^ git reset --hard HEAD^^ git reset --hard ${COMMIT_ID}
如果你忘记了回滚的某个 ${COMMIT_ID}
,可以用 git reflog
来查看你的每一次 git
命令记录的
1 2 3 4 5 6 7 8 9 10 11 Administrator@DESKTOP-77SDJG0 MINGW64 /d/lyc/git/learngit (master) $ git reflog 683d979 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^^ 81222a5 HEAD@{1}: reset: moving to 81222a56 c9094e7 HEAD@{2}: reset: moving to HEAD^ 81222a5 HEAD@{3}: commit: append GPL. c9094e7 HEAD@{4}: commit: add line name 683d979 (HEAD -> master) HEAD@{5}: commit (initial): add READ.md $ git reset --hard 81222a5
此时再推到远程仓库用 git push
会报错,需要用 -f
强推上去才可以。
git revert 版本回退
再当前版本的基础上新增一个版本,不影响以前的代码
1 2 git log --oneline git revert -n ${COMMIT_ID}
这里可能会出现冲突,那么需要手动修改冲突的文件。就正常的提交流程就可以了,会生成一个新的版本在最新,不会影响到以前的版本。
3.撤销 commit 前的修改 对于还未添加到暂存区文件,可以直接丢弃工作区的修改:
1 2 git checkout -- <file> git checkout -- .
对于已经添加到到暂存区,还未 commit 到仓库区:
1 2 git reset HEAD readme.txt git checkout -- readme.txt
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用 HEAD
时,表示最新的版本。
在 commit 推送到远程仓库之前,都可以撤销,但是如果把 commit 推送到远程仓库,那就无法撤销了!
4.删除文件 1 2 3 4 5 6 7 8 9 10 rm -f 1.txt git rm 1.txt git commit -m "rm 1.txt" git checkout -- 1.txt
git mv 改名文件 1 git mv [old_file] [new_file] # 改名文件,并将这个变动放入暂存区
5.找回之前版本删除过的目录 我要找回 roles/node-exporter
这个目录。首先查看 commit_id
1 2 3 4 5 6 7 8 9 10 $ git log --oneline bfa4f4d (HEAD -> develop, origin/develop) rabbitmq剧本编写, 支持部署单节点/三节点集群 6ed2cf7 1975f96 gpgcheck: no 240fb8c 剔除ucloud配置 e5bacf5 rsync适配rockylinux9 9727376 弃用二进制node-exporter 751b528 剔除参数CLOUD aaec767 适配rockylinux9 1b4b775 Nginx 默认安装版本提升至 1.22.1,zlib, pcre, pcre2, openssl 依赖版本更新到最新
替换 为包含被删除目录的先前提交的哈希值, 是被删除目录的路径。
1 git checkout <commit-hash> -- <directory-path>
即:
1 $ git checkout 751b528 -- roles/node_exporter
验证,该目录已添加到当前的 暂存区:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $ git status -s A roles/node_exporter/CHANGELOG.md A roles/node_exporter/README.md A roles/node_exporter/defaults/main.yml A roles/node_exporter/handlers/main.yml A roles/node_exporter/meta/main.yml A roles/node_exporter/node_exporter.yml A roles/node_exporter/tasks/app_check.yml A roles/node_exporter/tasks/app_install.yml A roles/node_exporter/tasks/app_register.yml A roles/node_exporter/tasks/app_service.yml A roles/node_exporter/tasks/main.yml A roles/node_exporter/templates/node_exporter.service.j2 A roles/node_exporter/templates/node_exporter.yml.j2 A roles/node_exporter/vars/main.yml