#Ubuntu_16.04#__代码管理工具Git的安装与使用
一、安装Git并设置
一)安装
sudo apt-get install git
二)设置Github关联
详见参看链接1
在github中添加ssh key详见上述链接,如果在gitlab中添加ssh key,具体页面如下所示:
二、常用命令
一)查看帮助
git 命令 --help
#例如
git push --help
二)查看分支状态
git log #查看当前分支的历史版本和更新记录
git reflog #查看仓库中历史版本的修改记录,是git log的简洁信息显示
三、使用Git管理项目
cd project_folder #进入工程所在文件夹
git init #创建git仓库,会生成一个.git隐藏文件夹
git add -A #将工程所有文件夹添加到git仓库,“-A”表示添加所有文件到仓库,可以直接输入指定文件(需要指定明确的路径),即表示添加制定文件到仓库
git status #查看当前分支下所有文件的状态
git commit -m “description of the added version” #添加软件版本的描述信息
git push origin master #将本地master分支下的内容更新到远程github或gitlab上,如果只是本地的工程,则可以进行这一步
四、分支操作
一)查看当前所有分支
终端中显示的绿色并有指向标指示即为当前所在分支
git branch
二)创新一个新的分支
git branch newbranch #创建一个本地分支
git push origin newbranch:newbranch #创建一个远程分支
三)转换到指定分支
git checkout branchname
四)删除分支
#删除分支local_branch
git branh -d local_branch
#删除分支remote_branch
git push origin --delete remote_branch
#远处分支删除后同步本地的远程分支
git branch -a:查看本地和远程分支(fetch同步下来的)
git remote show origin:显示本地分支和远程分支的追踪情况,如果fetch下来的远程分支在远程已经被删除,那么这个 命令会显示stale,表示没有追踪到远程分支
git remote prune origin:同步远程删除的分支
五)查看文件状态
1)通过 git status 命令查看
2)文件包括三种状态2:
Changes to be committed:表示文件处于缓存区,处于staged状态,可以通过git commit命令添加到仓库区(本地仓库)
Changes not staged for commit:显示的是工作区(本地可操作的文件)和仓库区中文件的状态,显示为modified或者unmodified状态,如果是unmodified状态则不会显示
Untracked files:表示该文件仅在工作区,没有保存在仓库区和缓存区3
对于文件在这个几个状态之间的切换,可以通过一定的命令进行4
五、本地仓库与远程仓库交互
代码提交到仓库的流程如下所示2,下述示意图描述了代码4个工作区域转移的关系,具体为工作去(Workspace)、暂存区(Stage/Index)、本地仓库区(Repository或Git Directory)、远程仓库区(Remote Directory)
一)本地仓库代码提交到远程仓库
#使用范例:
git push <远程主机名> <本地分支名>:<远程分支名>
#例如:
#从本地的master分支上传到远程仓库的master分支,并合并内容
git push origin master:master
git push origin master //等效命令
#强制上传本地master分支到远程master分支,覆盖远程仓库的版本
git push --force origin master
git push -f origin master #等效命令
git push origin +master #等效命令
#删除远程仓库的分支
git push origin --delete master
git push origin :master #等效命令,使用空分支覆盖远程分支
#新建远程分支newbranch,并将本地master分支推送到远程newbranch分支
git push origin master:newbranch
二)远程仓库代码载入本地仓库
1、从远程仓库中下拉分支,并在新加一个分支
下述命令实现,在本地新建一个分支local_branch,并将远程分支remote_branch的内容下拉,然后切换到本地分支local_branch。
git checkout -b local_branch origin/remote_branch #这种方法会自动建立本地分支和远程分支的映射关系
git fetch origin remote_branch:local_branch #这种方法不会自动建立本地分支和远程分支的映射关系
2、从远程仓库中下拉版本,并合并到本地分支
git pull 命令用于从远程获取代码并合并本地的版本。7
git pull 是 git fetch 和 git merge FETCH_HEAD 的简写。
#使用范例:
git pull <远程主机名> <远程分支名>:<本地分支名>
#下拉远程的master分支,并与本地的localbranch合并
git pull origin master:localbranch
git fetch origin master:localbranch + git merge localbranch #等效于这2条命令
#下拉远程的master分支,并与本地当前的分支合并
git pull origin master
相比之下,git fetch会更加安全一些。
六、版本回退与删除
一)查看commit id
- 查看完整的commit id
1.1 获取某次的commit id
在终端输入:git rev-parse HEAD
在终端输入:git rev-parse HEAD~2
其中最后的数字表示倒数第几次的意思
1.2 获取所有的commit id记录
在终端输入:git log
根据返回的内容,通过commit找到对应的commit id
1.3 查看所有的git操作记录
在终端输入:git reflog
根据返回的内容,通过commit找到对应的commit id - 查看缩写的commit id
在终端输入:git rev-parse --short HEAD
在终端输入:git rev-parse --short HEAD~2
其中最后的数字表示倒数第几次的意思
二)回退到上一版本
git reset --hard HEAD^ #回退到上一版本软件
三)回退到指定版本
git reset --hard commit_number #通过git log命令查看需要回退的版本的commit号
git reset --hard ID #通过git reflog命令查看需要回退的版本的ID号,就是版本最前面的ID号
git reset --hard HEAD~number #通过git reflog命令查看需要回退的版本的number号
如果回退之后,又想返回到新的版本,可以通过commit或ID号返回对应的版本。8
四)删除远程仓库中提交记录
删除远程仓库中记录的方法是先在本地回退到指定版本,然后在强行push到远程仓库,覆盖之前的提交记录,所以只能删除最新的1个或几个提交记录,无法删除中间某个记录,通过2条命令实现9。
git reset --hard HEAD^ #回退到上一版本
git push --force origin master #强行将本地仓库的版本推到远程仓库
五)修改commit
-
分支在本地
1.1 添加修改到最近一次的commit
终端输入:git commit --amend
在弹出的页面中,你会看到对应的需要修改的commit,直接修改commit即可,然后保存退出
1.2 修改多次之前的commit
1)在终端输入:git rebase -i HEAD~2
其中最后的数字表示显示倒数几次的commit,2表示显示倒数第一和第二次的commit
2)在弹出的页面中,将需要修改的commit前面的pick改为edit,然后保存退出
3)接下来终端会提示输入相应的命令
先输入:git commit --amend
然后与1.1中的操作一样,修改需要修改的commit
4)再根据提示输入:git rebase --continue
如果是需要之前多个commit,则在1)中输入对应commit的次数,在2)中将修改的commit前面的pick都改为edit,接下去根据提示进行操作既可以,具体操作与上述3)和4)一致,需要修改几个commit就会进行几次的3)和4)操作
详细图示教程参见 -
分支已经上传到远端
将远程分支下拉到本地,然后按上述操作进行
然后使用本地分支强行覆盖远程分支,具体参见本文第七部分 -
查看commit
3,1 git log
查看对应commit的commit_id
3,2查看指定版本的commit_id
获取完整commit id(如:bb4f92a7d4cbafb67d259edea5a1fa2dd6b4cc7a)
git rev-parse HEAD
获取short commit id,完整commit_id的前7位(如:bb4f92a)
git rev-parse --short HEAD
六)合并commit
- 仅合并本地分支的commit
1)git rebase -i start_commit_id end_commit_id
合并start_commit_id和end_commit_id之间的commit,如果end_commit_id没有输入,默认是当前的commit,其中start_commit_id为待合并的2个commit之前的一个commit_id,如下图所示,如果想要合并“add 2 line” 和 “add 3line” 所对应的2个commit id,则start_commit_id是“add 1 line” 对应的commit id;
2)在终端输入该命令之后会弹出修改界面,将“add 3line” commit内容最前面的pick改为squash,合并commit是将新的commit合并到旧的commit中,所以是将新的commit前面的pick改为squash,如果修改错误,并且保存了结果,那么rebase将会出错,可以输入git rebase --abort取消上一次的修改,然后重新修改;
3)保存退出,然后会自动进入到修改commit内容的页面,将需要合并的commit进行修改,留下最终需要的commit,保存退出。
- 在终端输入git log,可以看到修改后的commit。
- git rebase可以合并多个commit,不过只能将新的commit合并到旧的commit。
详细操作参见
- 合并远程分支的commit
将远程分支pull到本地,然后按照上述操作进行commit合并,完成合并之后,强制push到覆盖远程的分支
git push -f
注意:使用该方法进行远程分支的commit合并时,要确保远程是你拥有绝对控制权的,否则可能会带来很多不必要的麻烦,最好这个分支是只有你一个人在使用的情况,因为git push -f会使用本地分支内容强行覆盖远程的分支,而合并commit之后,有一些历史版本会被删除,如果在次之前有人pull了这个分支,然后你又将其中的某些版本删除并进行了覆盖,其他人在操作的时候可能会出现问题。具体参考
七、强行覆盖
一)强行覆盖本地分支
如果本地分支修改了很多之后,并且commit了一版,然后发现commit的代码有问题,想使用远程分支覆盖本地分支重新开发,此时有多种方式可以实现使用远程分支覆盖本地分支的操作。
1、回退本地版本+下拉远程分支
git log
git reset --hard commit_number #通过git log命令查看需要回退的版本的commit号
git pull origin remote_branch #将远程的remote_branch 分支下拉到本地当前分支
2、更新远程代码到本地+强行覆盖
自己实际没有使用过。
git fetch #将远程代码更新到本地仓库
git reset --hard origin/master #git reset会将本地的master分支重置为刚刚fetch的内容,其中master为本地需要覆盖的分支名称
3、通过git pull --force强行覆盖
自己实际没有使用过。
git pull --force origin remote_branch:local_branch
二)强行覆盖远程分支
git push --force origin remote_branch:local_branch