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)已经提交了不合适的修改到版本库时,想要撤销本次提交,只能回退版本,不过前提是没有推送到远程库。

推荐阅读更多精彩内容