虽然之前有git的笔记了,但是操作和命令太多,有点冗余,下面整理出最常见的一些场景和git需求。
零、Git速查表
好习惯:每次提交后和开发代码前,都应该pull下
常见命令:
git clone拉取服务器代码,如果是新建项目,可以用git init初始项目
git config配置邮箱密码
git branch算法在分支开发完后,合并到master主分支
git checkout切换分支
git status查看文件变动,如改变readme文件内容
git add提交文件到暂存区,会显示Changes to be committed: (文件已提交到暂存区)
git push将本地代码推送到服务器,比如在github中点击 Branch:master 下拉按钮能看到对应分支的提交;另外配置文件.gitignore内容不会被推送到服务器上
git pull将服务器代码拉取到本地
注意:如果线上代码做了变动,而你本地的代码也有变动,拉取的代码就有可能会跟你本地的改动冲突,一般情况下 Git 会自动处理这种冲突合并,但如果改动的是同一行,那就需要手动来合并代码,编辑文件,保存最新的改动,再通过 git add . 和 git commit -m ‘xxx’ 来提交合并。
分支:git中origin是远程仓库的别名,也可叫为main。master分支是最稳定的(平时不能直接在上面操作);短期分支可以不用上传到远程,当完成bug修复或者需求开发后,才需要合并到主分支上
git add
是个多功能命令,可以理解为“精确地将内容添加到下一次提交中”而不是“将一个文件添加到项目中”要更加合适。:- 可以用它开始跟踪新文件,
- 把已跟踪的文件放到暂存区,
- 合并时把有冲突的文件标记为已解决状态等。
- 暂存区和非暂存区:
Changes to be committed
的即在暂存区,Changes not staged for commit
的即在非暂存区。
- 跳过使用暂存区域:在提交的时
git commit -a
- 重置账号密码:
git config --system --unset credential.helper
。 - 如果要删除已经提交到远程服务器中的项目的部分文件:
git rm -r -n --cached 文件/文件夹名称
加上 -n 这个参数,执行命令时,是不会删除任何文件,而是展示此命令要删除的文件列表预览
// 确认无误后删除文件
git rm -r --cached 文件/文件夹名称
//提交到本地并推送到远程服务器
git commit -m "提交说明"
git push origin master
一、git的三个分区
- 肉眼可见的是work dir工作目录:
- 在此执行
git add
后会把指定文件添加到stage/index area
暂存区中, stage/index area
存在修改后,会把修改存到commit history
区(就HEAD
指针指向的位置)。每个commit
都有唯一的一个hash值。
- 在此执行
- 将work dir的修改提交到
history
区:先git add然后git commit就行了,或者一个快捷方法是使用命令git commit -a。 - 只要不乱动本地的
.git
文件夹,任何修改只要提交到history
中都不会消失,可以通过git reflog
查看操作记录。- 所以如果因为
HEAD
指针的回退,导致有的commit
在git log
命令中无法看到,可以通过git reflog
查看它们的hash值(如下图所示)。
- 所以如果因为
二、把stage中的修改还原到work dir中
场景:修改work dir中的两个文件a和b后(同时也添加到stage
),又对a文件修改,想把a还原为stage
中的a文件。
方法:git check a.txt
;如果很多被修改的文件很多,且都需要还原,可以使用git checkout .
,该命令不会删除后来在work dir中新添加的文件。
三、将history区的文件还原到stage区
场景:写了几个代码文件后一股脑使用git add .
添加到stage
中,突然想起a.txt
没写完 想从stage
中移除 写完再提交。
方法:git reset a.txt
;这样后面git commit
就不会把a文件提交到history
区了。
四、将history区的历史提交还原到work dir中
场景:从github上clone
了一个项目,乱改一通后跑不通,后悔就想改回最初状态
方法:git checkout HEAD .
;work dir和stage中所有的「修改」都会被撤销,恢复成HEAD指向的那个history commit。
慎重:这个操作会将指定文件在work dir的数据恢复成指定commit的样子,且会删除该文件在stage中的数据,都无法恢复,所以应该慎重使用。
五、合并多个commit
场景:本地从17bd20c
到HEAD
有多个commit,想把它们合并成一个commit后再推送到仓库。
方法:git reset 17bd20c
后照常git add .
和commit操作;即将HEAD
移动到17bd20c
这个commit中。
六、解决冲突
直接使用IDE的可视化git工具,比git diff
方便。
七、.gitignore文件不生效咋办
.gitignore
只能忽略那些原来没有被追踪的文件,如果某些文件已经被纳入版本管理中,修改.gitignore
会不起作用。
方法:先将本地缓存清除,改成未被追踪状态,然后提交。
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
git push -u origin master
显示正在追踪的文件:
git ls-tree --full-tree --name-only -r HEAD | tree --fromfile .