git大全解
一、基础概念
首先在本地git init
,然后再git clone
用于第一次下载完整项目。
注意与服务器之间使用的是ssh
连接,所以自己部署服务器的话要把公钥复制到服务器上。
同时要在本地配置用户名和密码来保证能够连接远程服务器,用的是git config user.name
以及git config user.email
指令,加上-g代表全局,不加的话只在当前项目中有用。
head代表你当前所在的分支的最新一次提交。
origin是远程仓库的默认名称。当然,可以通过git remote add
来添加别的远程仓库。在拉取代码的时候,通过git pull <remote> <branch>
,以及git fetch <remote>
区分所拉取的远程仓库名称。
二、操作
2.1 正向操作
其中remote代表远程仓库,repository代表本地仓库,index代表暂存区,workspace代表工作区。
基本操作就是先git add来将工作加入暂存区,然后通过git commit提交到本地仓库,最后通过git push推送到远程仓库。
从远程仓库可以直接通过git pull来拉取到本地仓库和工作区,也可以分开来操作,git fetch + git merge也可以达到一样的效果。
git fetch
:只负责将远程仓库的最新提交下载到你的本地,但不会触碰你的本地工作区和当前分支。这让你有机会先审视远程仓库的更新。
git merge
:当你确信远程更新没有问题时,再手动执行 git merge origin/main
,将远程更新合并到你的本地分支。
git status:查看提交状态
git log:查看历史,从项目开始到现在所有的历史记录。
2.2 逆向操作
checkout可以将目前工作区所有内容强制丢弃,git checkout -f。
checkout还有切换分支的作用,所以为了便于区分,把checkout分为了merge和switch两个功能。
如果想从暂存区恢复到工作区,可用git restore <file>
,会用暂存区的文件内容,覆盖工作区的文件。
从本地仓库恢复到暂存区,可以用git restore --staged <file>
。
从本地仓库恢复到工作区,可以用git restore --staged <file>
+git restore <file>
。
git reset --soft
: 它会移动 HEAD 指针到指定的提交 <commit>
,但会保留暂存区和工作区的改动。
git reset --mixed
:如git reset --mixed HEAD~1
,它会移动 HEAD 指针,然后用新 HEAD 的内容覆盖暂存区,但保留工作区的改动。
git reset --hard
:它会移动 HEAD 指针到指定的提交,然后用新 HEAD 的内容彻底覆盖暂存区和工作区。
用reset和restore最大的区别是,reset会回退commit,而restore不会。
2.3 整理操作
git commit --amend 可以服用上一次commit,将此次提交合并到上一次提交。
git rebase -i h1 h2 :可以整理多次提交
左开右闭:会从 h1
的下一个提交开始,一直到 h2
的所有提交,都作为交互式变基的对象。
提交该指令后,会打开一个编辑器,在每个提交前都有一个pick,可用edit替换pick,来指示需要修改对应的提交。
然后会进入类似rebase1/3,修改好了以后,使用 git add
,git commit --amend
(此次修改附加到上一次修改)和 git rebase --continue
来继续变基过程。
2.4 分支操作
git branch 查看分支
git branch develop 创建分支
git checkout -b develop 创建并切换分支
合并分支有两个方法:
merge——将不同分支的提交历史合并成一个统一的提交历史。
合并分支如果是使用merge,便是:
1.拉取 master 最新数据;
2.先把 master 合井到 develop,在develop分支运行git merge master,如有冲突会进入merging状态。此处merge是为了在develop分支上处理冲突。
3.然后修改并测试代码,如果解决了冲突,则重新git add . 并用git commit -i去除Merging状态。
4.回到master分支,将develop合井到 master,(这里涉及一次快进式合并,Git 只是简单地把 master
分支的指针,直接向前移动到 develop
分支的最新提交。)测试如果 ok 提交到远端
纯粹用git merge的方式多了一次提交,而rebase没有提交。
如果当前develop分支不被别的分支依赖,可以用git rebase来合并分支,只是不太推荐使用,很多大公司都禁用:
1、拉取 master 最新数据;
2、在develop上,git rebase master,变基develop所有提交到master最新提交上,会进入rebase1/n状态。
3、解决冲突,git add .,git rebase --continue,便可复用develop上的最新提交,并结束rebase状态。
此刻,develop的所有提交变基到master最新提交上了。
相当于从
A – B – C (master)
\
D – E (develop)
变成了
A – B – C (master)
\
D’ – E’ (develop)
4、回到master分支,将develop合井到 master,git merge develop。测试如果 ok 提交到远端。
因为git rebase会改变提交id,如果别人依赖我的分支(develop),便会发生异常。
删除分支:git branch -d develop。
删除远程分支:git push origin -d develop。