赞
踩
Git是分布式版本控制系统。Github和华为等均使用Git作为代码管理工具。之前在工作中比较常用到的是克隆、代码提交拉取、解决回合冲突、代码回滚等。在实际的工作中,可能回合时冲突及版本回退的情况较多,下文将着重介绍这两点。本文不涉及Git的安装等,主要以介绍概念及原理为主。
个人感觉使用Idea内置的git比通过Git Bash使用Git命令要方便且易操作。
Git分为工作区、暂存区、本地仓库和远端分支。
1、工作区:本地电脑上的某项目工程的代码文件夹就是工作区。
2、暂存区:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存了很多的东西,其中最重要的就是成为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
我们把文件往Git版本库里添加的时候是分两步执行的;
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步:是用git commit提交更改,实际上就是把暂存区的所有内容提交到本地仓库。
需要提交的文件修改统统放到暂存区,然后一次性提交暂存区的所有修改。
3、本地仓库
本地仓库就是上图的本地版本库,克隆自远程仓库。从下图可以看到,工作区、暂存区、本地仓库都是在本地计算机上的。
4、远端分支
git push命令能将本地仓库的代码上传到远端分支,但是必须经过committer确认之后才能合入远程分支。托管在网络上的项目仓库,Git的远程仓库是分布式的,能够极大保证代码的安全性。
因为自己的远程fork库一般只有自己一个分支(master),即一个人一个仓,所以在自己名下的代码库基本不会产生冲突。目前产生合并冲突只有两种可能性。
1、本地代码进行了一些修改,远程fork库同步了远程中心库(Merge),然后本地clone库从远程fork库更新代码(pull)。
2、本地代码进行了一些修改,并成功push到远程fork库。但是合入远程中心库时,因为其他人比你先合了代码,你的fork库并没有拉取到这个更改。因此在ISource上请求合并时,如果你们更改了同样的代码,就会提示,存在冲突,无法发起合并请求。
git reset和git revert都用来撤销代码仓库中某些更改。
git reset在本地代码库,add或commit以后发现提交的代码有问题,删除自己个人分支上还没合入主线的提交。用于个人库。
顾名思义,重置分支,将当前的分支重设(reset)到指定的或者HEAD(如果不显示指定commit)默认是HEAD,即最新的一次提交。有三个参数可供选择。
1、–hard
缓存区和工作区都同步到你指定的提交,重置文件索引,自指定提交以来在工作区中的任何改变都被丢弃,并将版本库重置为指定提交(commit)。
2、–mixed
缓存区同步到你指定的提交,重置文件索引,但是代码的改动仍留在工作区中,不会被丢弃。并将版本库重置为指定提交(commit)。
3、–soft
工作区、缓存区、文件索引都不会改变,仅仅将版本库重置为指定提交(commit)。
其作用域如下图所示:
git revert 代码已经push上库,同时回滚本地和线上代码到指定版本,用一个新提交来消除一个历史提交所做的任何修改。用于版本库。
1、如果已经push到远程fork库,reset删除指定commit以后,gitpush可能导致一大堆冲突,但是revert并不会。
2、reset是在正常的commit历史中,删除了指定的commit,这是HEAD是向后移动了,而revert是在正常的commit历史中再commit一次,只不过是反向提交,他的HEAD是一直向前的。
3、git revert也有可能会重写文件。所以,Git会在你执行revert之前要求你提交或者缓存你工作目录中的更改。
六、Git基本语法
语法 | 功能说明 |
---|---|
git clone | 克隆版本库 |
git pull | 拉回远程版本库的提交 |
git push | 推送至远程版本库 |
git add | 添加至暂存区 |
git add -interactive | 交互式添加 |
git apply | 应用补丁 |
git am | 应用邮箱格式补丁 |
git annotate | 同义词,等同于git blame |
git bisect | 二分查找 |
git blame | 文件逐行追溯 |
git blame +文件名 | 显示文件的每一行是在哪个版本最后修改 |
git branch | 分支管理 |
git cat -file | 版本库对象研究工具 |
git checkout | 检出到工作区,切换或创建分支 |
git cherry -pick | 提交拣选 |
git citool | 图形化提交,相当于git gui命令 |
git clean | 清除工作区未跟踪文件 |
git commit | 提交 |
git config | 查询和修改配置 |
git describe | 通过里程碑直观地显示提交ID |
git diff | 差异比较 |
git difftool | 调用图形化差异比较工具 |
git fetch | 获取远程版本库的提交 |
git format -patch | 创建邮箱格式的补丁工具 |
git grep | 文件内容搜索定位工具 |
git gui | 基于cl/TK的图形化工具,侧重提交等操作 |
git help | 帮助 |
git init | 版本库初始化 |
git init -db | 同义词,等同于git init |
git log | 显示提交日志 |
git log - - pretty = oneline | 显示每个版本都修改了哪些文件与git show (commit id),不过每个修改版本都包含了 |
git merge | 分支合并 |
git mergetool | 图形化冲突解决 |
git mv | 重命名 |
git push origin HEAD --force | 回退个人远端 |
git rebase | 分支变基 |
git rebase -interactive | 交互式分支变基 |
git reflog | 分支等引用变更记录管理 |
git repo -config | 同义词,等同于git config |
git reset | 重置改变分支,“游标”指向 |
git reset --softcommitID | 本地代码回退到某一版本 |
git rev -parse | 将各种引用表示法转换为哈希值等 |
git revert | 反转提交 |
git rm | 删除文件 |
git show | 显示各种类型的对象 |
git show (commit id) | 显示某个版本的修改详情 |
git show +文件名 | 显示某个版本的某个文件修改情况 |
git stage | 同义词,等同于git add |
git stash | 保存和恢复进度 |
git status | 显示工作区文件状态 |
git tag | 里程碑管理 |
git whatchanged +文件名 | 显示某个文件的每个版本提交信息,提交日期,提交人员,版本号,提交备注(没有修改细节) |
1、配置基本信息
$git config --global user.name XXX
$git config --global user.email XXX
2、克隆中心库到本地
$ git clone +中心库地址
3、新增和修改文件名
$ git add +文件名
注:将需要添加的文件拷贝到工作目录或直接创建,此操作只是将需要添加的文件转移至缓存
区,如果需缓存当前目录下的所有非受控文件,则可以通过“git add.”命令来完成已在缓存区但
不需提交的文件怎么办?
$echo “first” >>>first
$git add first
提交:$git commit
注:此操作是将所有缓存区的修改提交到本地版本库
4、取消已缓存的修改(回退)
(1)$ git rest -hard HEAD+文件名
(2)$ git rest HEAD+文件名
注:此操作将修改的文件从缓冲区内删除,不影响本地内容
5、删除文件
$ git rm 文件名
注:此操作只是删除文件并将删除的信息转移至缓存区,要想删除库上的文件需要执行commit操
作,同样适用git reset恢复
eg: $ git rm second
$ git commit
6、取消本地文件的修改,包括删除的文件
(1)$ git checkout(HEAD/commitID)
注:此操作将取消本地文件(未提交)已做的但未提交的修改,如果需回退当前目录下的所有修改
文件,则可以通过“git checkout .”命令来完成各成。
eg:$ git checkout -first
(2) $ git clean -f
注:清除本地未被跟踪的所有文件,使用时需要注意是否确定需要清除
7、重命名文件或目录
$ git mv 原文件名 新文件名
注:重命名或者移动本地文件或目录,mv后直接到缓存区,需要执行commit操作
eg:$ git mv first first_new
8、查看文件状态
注:查看本地库中所有文件的状态,包括未受控的、已修改、已缓存。冲突文件的状态也表现为已
修改的。
9、比较文件
$ git diff OldcommitID NewcommitID(前6位)
注:比较文件/目录下所有文件修改前后的不同,不加CommitID,则比较本地的与缓存或缓存的与
库中最新的。
新添加的文件使用git diff的时候不能显示
git diff和 git diff -cached的不同
10、查看修改日志
$ gitk --all
注:此操作将调出git日志的图形化界面,在相关的版本号上右击选择“Create new branch”
来创建基于此项的新分支,需要运行Xming
$ git log
注:在命令行中查看log信息
注意:查看日志信息只能看到本地的修改日志和已经获取到本地的远端修改日志,不能看到远端
还没有获取到本地的修改日志。
11、创建私有分支
$ git branch 分支名 commitID
$ git checkout -b 分支名 commitID
注:此操作是基于commitID即某一个全球版本号拉出新分支,如果没有则基于当前分支的HEAD
拉出新分支。$ git checkout -b +分支名 commitID=$ git branch 分支名commitID +
$ git checkout 分支名
12、合并分支
(1)直接合并$ git merge +分支名
注:此操作是将“分支名”指示的分支合并到当前所在的分支,所以合并前必须切换到目标
分支。
(2)拣选合并 $ git cherry -pick commitID
注:将某次特定提交合并到当前分支,首先合并前必须切换到目标分支。
13、查看分支
$ git branch
注:查看当前git库中的所有分支,“-r”是查看git库中对应的远程分支参照。
14、检查分支是否合并到当前分支
$ git branch -mergerd
注:查看已经合并到当前分支的所有分支。
$ git branch -no -merged
注:查看还没有合并到当前分支的所有分支。
15、删除私有分支
$ git branch -d/-D 分支名
注:此操作“-d”删除分支前会检查分支中的内容是否都已经合并到其他分支,如果 没有,则命
令不执行;“-D”不进行检查,直接删除分支。
16、重命名分支
$ git branch -m oldbranch newbranch
注:此操作是将“oldbranch”分支的名称改成“newbranch”。如果需要拉出分株,并同时切换到
新分支可以用“git checkout -b branch1 branch2”。
17、上传修改到远端(fork)库
$ git push 远端库名称 本地分支名称:远程分支名称
注:此操作是将本地库的修改同步到中心库,如果本地分支的名称和远程分支的名称相同,则远
程分支名称可忽略。
eg:$ git push origin new :new -br
18、更新当前模块
$ git fetch 远端库名称(获取远端库的更新到本地库)
$ git fetch origin
$ git merge 远程库名称/分支名称(将中心库的更新合并到本地工作目录中)
$ git merge origin/new -br
19、修改提交信息
$git commit -m “新的提交信息” -amend
注:此操作只能修改最新的一次提交,之前的提交无法修改。
20、回退某一历史版本,然后提交到本地库
$ git revert 全球版本号
注:此操作将回退记录到历史的某一节点,并作为一次新的提交到库中。
21、暂存本地修改
$ git stash
注:此操作是将本地未提交的修改暂存起来,并将文件状态恢复到HEAD,如果要恢复暂存的修
改,运行“ git stash pop”即可,非常适合临时插入的紧急bug修改。
22、二分法定位错误
$ git bisect start
$ git bisect bad CommitID
$ git bisect good CommitID
注:此操作用于定位问题引入的点,输入如上命令后,git会自动切换到中间的状态,经过测试
输入测试结果“git bisect good/bad”,重复以上,直接定位出出错的提交,然后通过
“git bisect reset”退出。
23、解决冲突
合并分支或者合并库上的更新到本地均会产生冲突。Git的冲突产生是由于同一文件的同一行
内容。
哪些情况会出现冲突:1.修改了同一个文件的同一行;2.文件被重命名为不同的名字;3.在一个
分支上文件被删除在另一个分支上该文件被修改。
24、变基
$ git rebase 目标分支 原分支
注:此操作将原分支变基到目标分支HEAD上。
从主项目pull拉最新代码到本地,如果有冲突在本地解决冲突的成本比在合并的时候再解决要低很多,所以建议在合并到主项目之前,先pull一下主项目的最新代码后在提交合并请求。在这里,你可以用“pull”命令把“origin”分支上的修改拉下来,并且和你的修改合并,结果看起来就像一个新的“合并的提交”(merge commit)。但是,如果你想让“mywork”分支历史看起来像没有经历过任何合并一样,你也许可以用 git rebase。
$ git checkout mywork
$ git rebase origin
这些命令会把你的“mywork”分支里的每个提交(commit)取消掉,并且把它们临时保存为补
丁(patch)(这些补丁放到“git / rebase”目录中),然后把“mywork”分支更新到最新的
“origin”分支,最后把保存的这些补丁应用到“mywork”分支上。
24、忽略某些文件
在git仓工作的根目录下面,创建gitignore文件,文件内容如下实例,同样gitignore文件也
可以上传到库上,这样每次下载都可以记录忽略规则,如果将某个已经忽略的文件添加,使用
$ git add -f文件名即可。
* .a #忽略所有.a结尾的文件
! lib.a #但lib.a除外
/TODO #仅仅忽略项目根目录下的TODO文件,不包括subdir/TODO
build/ #忽略build/目录下的所有文件
doc/*.txt #会忽略build/目录下的所有文件
doc/*.txt #会忽略doc/notes.txt但不包括 doc/server/arch.txt
25、使用GUI图形化操作界面
$ git gui
添加修改,删除文件时,可以直接通过“git gui”命令,调出图形界面,通过“stage changed”
缓存文件(新添加的文件只能通过git add命令缓存),在提交信息处输入“提交信息”,然后
通过“commit” 提交。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。