git:分布式
所谓分布式,就是每个开发者的本地客户端都是一个完整的仓库,都能记录历史版本信息,不需要联网也可以生成版本记录,也可以快速回退到某个版本。
如果只有一个人开发,可以不把本地历史版本记录上传到中央服务器,但如果多人协同开发则需要。
命令
git status
查看当前修改的文件处于哪一个区域:
红色–工作区,
绿色–暂存区,
看不见–已经提交到历史区(生成版本了)(commit过了)三区保持一致了。
git rm --cached xxx.xx
把暂存区某个文件删除
-
git rm --cached . -r : 删除暂存区中所有提交的
如果在删除过程中,发现从暂存区删除的文件在工作区已经被修改,只有加上 -f 才能强制从暂存区把内容删除
-
让暂存区内容覆盖工作区:
git checkout xxx.xx
回滚
git checkout .
把暂存区内容回滚到工作区(一旦回滚,工作区内容无法恢复)
git reset HEAD .
把当前暂存区内容(删除掉)回滚到上一个暂存区,目的是为了把上一个暂存区内容回滚到工作区
git reset --hard 版本号
在历史区(执行commit之后的)中回退到某一个版本(强制把暂存区和工作区都变成回退后的版本)
团队协作
注:master代表分支名
客户端A,客户端B,…,中央仓库
git push origin master :把本地历史区中的信息推送同步到中央服务器
git pull origin master :拉取–把中央仓库中的信息和本地仓库保持同步
基础流程:
-
创建一个中央仓库:可以基于GitHub(最好不要创建空仓库,因为没有任何分支,建议创建一个master分支)
-
创建客户端本地仓库(一个开发者就是一个单独仓库),还需要让本地仓库和远程仓库保持关联,以便实现后续的信息同步。
- 新建目录,然后git init 初始化一个仓库
- 本地仓库和远程仓库建立连接:git remote add origin 远程仓库地址(git://github.com/xxxx)||| git remote rm origin :移出本地仓库和远程仓库的连接
另:有更直接的方式–只要把远程仓库克隆到本地,就相当于创建本地仓库,而且自动创建了连接,并把远程仓库中的内容也同步到了本地。
$ git clone “远程仓库地址”
-
各自和中央服务器同步信息 (第一次:仓库的分支都是生成历史版本记录才有的)
推送:git push origin master (推送之前先拉取一下,避免冲突)
拉取:git pull origin master
单独分支
分支指的是历史区的分支。创建分支就是创建不同的线路,来管理历史版本。
-
新创建分支(会自动同步本地master分支中的内容到新分支上),切换到指定分支下
git branch :查看本地存在的分支
git branch -a :查看全部分支(远程和本地)
git checkout -b dev :创建并切换到这个dev分支 || 删除分支:git checkout -D dev
-
把自己本地分支内容,合并到自己本地master分支上,然后提交。
- git stash :暂存文件(分支内容有更改,不能直接切换分支,需要把修改的内容暂存)
- 切换到master分支上 git checkout master
- git stash pop :还原暂时存储的内容
- git merge dev(此时在master分支上):把dev分支内容合并到master分支上
- git pull origin 远程分支名
- git push origin 远程分支名(有冲突,i->ESC->:wq 1.把两份代码都保存在本地文件中;2.自己手动选择,重新提交)
补充
合并 :
1.merge 在开发过程中,多个分支产生了修改并进行了提交pull(会更改HEAD的指向到当前),然后需要进行合并(merge)到主分支(当前在主分支上),在合并分支的时候,由于产生了冲突,需要修改冲突,重新提交:(这种是no fast-forward)
add 把变更录入到索引中
commit 记录索引的状态
2.rebase 在当前上对主分支使用rebase
命令 ,然后修改冲突提交(此时不是用commit,而是执行rebase命令指定 --continue选项。),这样就可以执行 fast-forward合并了,此时切换到master分支,执行merge合并.
令 ,然后修改冲突提交(此时不是用commit,而是执行rebase命令指定 --continue选项。),这样就可以执行 fast-forward合并了,此时切换到master分支,执行merge合并.