Git 使用
Git操作
一、创建git仓库
git init --bare fasloan.git
授权限
chown -R git:git fasloan.git
远程库克隆
git clone git@X.X.X.X:/home/yd_fasloan/fasloan.git
二、创建与合并分支
(分支管理:你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。其他版本控制系统如SVN等都有分支管理,但是用过之后你会发现,这些版本控制系统创建和切换分支比蜗牛还慢,简直让人无法忍受,结果分支功能成了摆设,大家都不去用。但Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。)
1.创建dev分支,然后切换到dev分支:
$ git checkout -b dev
创建分支并切换git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
Switchedto branch'dev'
2. 用git branch命令查看当前分支:
$ git branch
* dev
master
git branch命令会列出所有分支,当前分支前面会标一个*号。
查看当前分支在dev分支上正常提交,比如对fasloan_view.py 做个修改,删除一行:print111然后提交:
3. 先查看当前状态:
当前状态表示修改了fasloan_view.py的文件内容,现在提交一下将文件加入暂存区:
添加暂存区对刚提交的文件进行描述,实际上是把暂存区的所有内容提交到当前分支:
描述修改简单解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。查看现在的状态,该工作区是干净的没有任务去提交:
当前状态现在,dev分支的工作完成,我们就可以切换回master分支:
切换分支查看fasloan_view.py文件,发现刚才删除那行仍然存在:
1.查看fasloan_view.py文件
查看文件内容2.内容未修改:
未改动内容解决办法:
因为那个提交实在dev分支上,而master分支此刻提交点并没有变。我们把dev分支上的工作修改合并到master分支上:
合并分支git merge命令用于合并指定分支到当前分支。合并后,再查看fasloan_view.py的内容,就可以看到,和dev分支的最新提交是完全一样的。
修改文件内容现在将所有改动都合并到主分支了,用git log看看分支历史:
查看分支历史在实际开发中,我们应该按照几个基本原则进行分支管理:
(首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev 分支上,也就是说,dev 分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。)
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
$ git merge --no-ff -m "merge with no-ff " dev
$ git log--graph --pretty=oneline --abbrev-commit
三、查看远程库的信息用git remote::
远程库信息或者,用git remote -v显示更详细的信息:
远程库信息上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。
四、推送分支
1.推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上
推送分支并不是一定要把本地分支往远程推送
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
2. 多人协作工作模式:
(1)使用git push origin <分支名> 推送自己的修改
(2)如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并
(3)]如果和并有冲突,则解决冲突,并在本地提交
(4)没有冲突或者解决掉冲突后,再用git push origin <分支名>就能推送成功
如果git pull提示no tracking information, 则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <分支名> origin/<分支名>
五、解决冲突:
新分支开发feature1:
创建新分支修改fasloan_view.py,添加了一行print(11)
添加一行内容提交:
提交到当前分支在master分支上把fasloan_view.py文件修改添加print(1111), 文件已被修改:
添加一行添加文件到暂存区并提交:
添加到当前分支这种情况git无法执行快速合并,只能试图把各自的修改合并起来,但这种合并可能会有冲突:
合并分支Git告诉我们,fasloan_view.py文件存在冲突,必须手动解决冲突后再提交。git status也可以告诉我们冲突的文件:
冲突文件内容修改内容之后保存,再提交:
修改提交文件删除feature1分支:
删除分支最后推到远程:
同步到远程库六、版本回退
Git每当文件修改到一定程度的时候,就可以“保存”一个快照,这个快照在Git里被称为commit,一旦把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,继续工作。
git log命令显示从最近到最远的提交日志,如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:
提交日志看到一大串类似7feo2的是commit id(版本号), 一个通过SHA1计算出来的非常大的数字,用十六进制表示。
回到上个版本,首先Git要知道当前版本是哪个,在Git中,用HEAD表示当前版本,也就是最新。上个版本HEAD^,上上个版本时HEAD^^, 当然网上100个版本,写成HEAD~100.
回退上一个版本:
回退版本已被还原:
还原版本若想再回去,只要命令行窗口还没有被关掉,可以顺着找commit id,于是就可以回到未来的某个版本,版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了:
回到指定版本你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本,Git提供了一个命令git reflog用来记录你的每一次命令:
查看记录又找回了你想回到指定版本的commit id。
七、撤销修改:
git checkout -- file可以丢弃工作区的修改:把文件在工作区的修改全部撤销有两种情况:
(1)文件自修改后还没有被放到暂存区,现在撤销修改就回到和版本库一模一样的状态。
(2)文件已经添加到暂存区,又做了修改,现在撤销修改就回到添加到暂存区后的状态。总之,就是让文件回到最近一次git commit或者git add时的状态。
修改文件并添加到了暂存区,庆幸的是在commit之前,用git status查看,修改到了暂存区,还没有提交;
用命令git reset HEAD fasloan_view.py可以把暂存区的修改撤销掉,重新放回工作区。假设不但改错东西,还从暂存区提交到了版本库,就只能回到上一个版本(条件是还没把本地版本库推送到远程)
总结:
(1)当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
(2)当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD ,就回到了场景1,第二步按场景1操作。
(3)已经提交了不合适的修改到版本库时,想要撤销本次提交,只能回退版本,不过前提是没有推送到远程库。