GIT基本命令讲解

GIT基本命令讲解最明显特征是分布式:客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都

一、当你建一个新仓库,GITLA会提示基本操作命令:

Command line instructions

Git global setup

git config –global user.name “范晓”

git config –global user.email “fanxiao01@cifi.com.cn”

Create a new repository

git clone -b develop ssh://git@gitlab.cifi.com.cn:2288/fanxiao01/ttttttt.git

cd ttttttt

touch README.md

git add .

git commit -m “add README”

git push -u origin develop

Existing folder

cd existing_folder

git init

git remote add origin ssh://git@gitlab.cifi.com.cn:2288/fanxiao01/ttttttt.git

git add .

git commit -m “Initial commit”

git push -u origin master

Existing Git repository

cd existing_repo

git remote rename origin old-origin

git remote add origin ssh://git@gitlab.cifi.com.cn:2288/fanxiao01/ttttttt.git

git push -u origin –all git push -u origin –tags

二、如下讲解GIT基本特性及详细使用

GIT 基本特点

1.直接快照,而非比较差异 2.近乎所有操作本地执行 3.时刻保持数据完整性

为什么要用GIT?

最明显特征是分布式:客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。

创建分支快捷轻便:创建分支其实只创建一个新的分支指针即可。

GIT基本原理:三种状态、四种对象(再次赘述下)

状态一:git repository 即 Git 目录( .git ) •每个项目都只有一个.git目录,为项目存储所有元数据和对象数据库。包括所有的对象(commits,trees,blobs,tags)。 •每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。

状态二:working copy Git 工作目录 •Git的工作目录存储从项目中取出的某个版本的所有文件和目录。 •当在项目的不同分支间切换时,工作目录里的文件经常会被替换和删除。所有历史信息都保存在GIT目录(.git)中;

状态三:staging area Git 暂存区域 •所谓的暂存区域只不过是一个简单的文件,一般都放在 Git 目录中。也可以叫做index索引文件。

四种对象: •blob–文件内容 •tree — 所有文件或目录名字及其属性的列表 •commit–表示一个版本,根据此对象内的tree或blob对象可以求索某个时刻整个版本仓库状态。 •tag–标签,它可以指向blob,tree,commit,大部分是commit

用户环境设置:

git config [–global | –system ] (–system 参数修改/etc/gitconfig文件,针对所有用户适用配置;–global 参数修改~/.gitconfig文件,针对该用户适用配置)

初始化仓库:

git init (创建一个空的git仓库或初始化一个已存在仓库,会建立一个隐藏.git目录)

获取代码库:

git clone [url] (默认把远程仓库整个clone下来,但只会在本地创建master分支;如果远程还有其他分支,git branch -a查看所有分支;git支持ssh、git、http/s、本地协议,一般用ssh协议)

添加目录下修改、或新增加的文件到仓库暂存区:

git add -A | -u | -f | filename (-A表示添加所有文件;-u添加所有跟踪文件;-f 强制添加被忽略文件;filename添加指定文件)

删除文件:

git rm [filename] 删除受版本控制的文件或文件夹 (-rf是删除文件夹)

移动文件:

git mv [sourcefile] [destinationfile] 移动源文件为目标文件,相当于重命名。

忽略版本控制的文件用正则匹配添加在.gitignore:

eg: $ cat .gitignore

# frameworks/base # 此为注释,被git忽略

*.a # 忽略所有.a结尾的文件

!lib.a # 但lib.a除外

!build/ # 忽略build目录下的所有文件

doc/*.txt # 忽略doc目录下的所有.txt结尾文件,但不包含doc/notes/*.txt

/TODO # 仅忽略项目根目录下的TODO文件,但不包含subdir/TODO

提交存储在当前index即暂存区的文件:

git commit -m ‘your description’ (提交后会显示本次提交的完整 SHA-1 校验和, 以及在本次提交中,有多少文件修改过,多少行添改和删改过;-a参数会兼并git add动作)注:不填提交说明不能提交

查看仓库状态:

git status (查看仓库当前工作于哪个分支;查看文件状态:被修改,被删除,新增加等)注:每次提交前,都用git status查看下是不是都已暂存起来了,然后再提交。

git status会提示你目前工作目录下各修改过的文件的状态:

eg:当前干净目录:

新建文件并跟踪:git status提示”new file”处于”Changes to be committed”状态,说明是已暂存状态。

修改已有文件README:git status提示”modified”文件处于”Changes not staged for commit:”状态,说明已跟踪文件的内容发生了变化,但还没有放到暂存区。要暂存这次更新,需要运行 git add 命令

git add 已修改文件:git status 提示已暂存状态,与刚才追加跟踪文件track一样:提示”Changes to be committed:”

git commit 两个文件:提示 “nothing to commit, working tree clean”

查看提交历史:

git log [ -5 | -p | – – author=”fx” | – – since/- -until =”2017-06-06-24″| – – graph | – – pretty=format:%h:%s ] (最近5次提交;fx的提交;-p显示所有的commit的详细的修改内容及提交信息;指定日期之后或截止指定日期的提交;图 形方式显示提交;定义格式显示)

比较差异:

git diff :不带参数比较的是wc与staging的差异;

git diff – -cached 比较的是stading与仓库的差异;

git diff HEAD比较当前工作空间与本地仓库差异;

git diff newbranch比较当前工作空间与新分支差异;

git diff – -state统计差异文件个数;

git diff tag1 tag2 ;

git diff ;

git diff tag1 tag2 file

还原版本:

git reset – -hard HEAD 回复到HEAD状态;

git reset – -hard HEAD^ 彻底撤销最近一次提交;

git reset – -soft HEAD~3 将最近3次提交撤掉到stage状态;

git reset – – mixed 撤销add动作

撤销提交:

git revert master~3 或git revert SHA1

修改提交:

git commit – -amend (如果上次提交时遗漏了文件,可以在提交后将文件加入缓存然后用该命令提交即可,它会打开vi编辑器让你编辑commit message)注:只限于未push的提交

比较git reset、git revert、git checkout、git commit

•git reset:撤销最近的提交,此次之后的修改都会被退回到暂存区,ws不变(默认参数–mixed)

•git revert:撤销某次提交,此次操作之前的commit都会被保留

•git checkout – – file:将文件从stage的状态撤销,原有修改将找不到; •git commit – -amend:修改最后一次提交的内容及注释

GIT如何创建分支并切换到新分支,如何在不同分支间转换,合并本地分支?

GIT如何把分支推送到共享服务器上,同世界分享?如何使用共享分支与他人协作,以及在分享之前进行衍合?解读如下……远程仓库: 列出当前远程库:git remote -v (-v列出远程仓库地址); 添加远程仓库:git remote add [shortname] [url] ; 查看远程仓库信息:git remote show [remote-name] ; 远程仓库重命名:git remote rename [remote-name] [new-remote-name] ; 删除远程仓库:git remote rm [remote-name] 从远程仓库拉取数据:git fetch [remote-name] (fetch只是拉取远程仓库你本地还没有的数据,不会自动合并到你本地分支,需要手动合并;如果设置了跟踪分支可以直接用git pull命令自带合并,创建跟踪分支见如下分支部分) 推送数据到远程仓库:git push [remote-name] [local-branch-name]:[remote-branch-name] 注:Push成功具备条件:你在所克隆的服务器有写权限;目前origin上的数据没被其他人推送过,如果在上次拉取到本次推送有人像origin推送过,必须先更新到本地再行推送。 标签: 查看标签:git tag –l ; 新建标签:三种类型 轻量级标签:实际就是一个保存着对应提交对象的校验和信息的文件。 创建时不需加-a,-s,-m参数:$ git tag v2017.06_01 含附注标签:存储在仓库中的一个独立对象,创建时用-a(annotated)指定标签名字,-m指定对应的标签说明:$git tag –a v2017.06_02 –m “testtag2” 签署标签:如果你有自己的私钥,还可以用 GPG 来签署标签(-s参数):git tag -s v1.5 -m ‘my signed 1.5 tag’ 补打标签:即对任何版本创建tag:$git tag –a v1.2.3 –m “testtag2” 04c5624ec6218e7 推送标签:默认情况下push不会将标签推送到远程服务器,需要带参数提醒git推送:$git push origin v1.2.3分支: 创建分支:git branch testing 切换分支:git checkout testing (创建并切换:git checkout -b testing;$ git checkout –b testing master # 基于master分支创建并切换到testing分支) 查看分支:git branch -v | – -merged | – – no-merged (-v显示各个分支最后一次commit信息;后两个参数显示已经(或尚未)与当前分支合并的分支) 删除分支:git branch -d testing 获取远程分支:git fetch origion/branchname 合并远程分支:git merge origin/branchname 创建跟踪分支:git branch branchname origin/remote_branchename ;创建远程分支的本地跟踪分支并切换上去:git checkout -b track_branchname origin/remote_branchename 删除远程分支:git push origin :branchname 注:对比git push [远程名] [本地分支]:[远程分支] 语法,如果省略 [本地分支],那就等于是在说”在这里提取空白然后把它变成[远程分支]”。分支合并:merge、rebase、cherry-pick举例:

test,master分支各有一次提交 共同祖先:C2

1、采用merge三方合并方式合并test分支的修改到master分支上:

$ git checkout master

$ git merge test

冲突解决:

任何包含未解决冲突的文件都会以未合并(unmerged)状态列出。git status —>显示unmerged状态

vi 冲突文件,合并部分用<<<,===,>>> 分隔符标记,手动解决冲突后,删掉这些标记;

在解决完所有文件的冲突后,执行git add ,使文件标记为冲突已解决;

运行git status查看文件状态为modified;

执行git commit 提交,完成这次合并提交。

2、采用rebase方式合并test分支的修改到master分支上,rebase方式官方叫衍合:分为两步完成

衍合基础:开发进程分叉到两个不同的分支,又各自进行了提交 衍合原理:回到两个分支的共同祖先,提取你当前分支每次提交时产生的差异(diff),把这些差异分别保存到临时文件里,然后从当前分支转换到你需要衍合入的分支,依序施用每一个差异补丁文件。step1: $ git checkout test; $ git rebase master;

说明:1、在test分支中,把C3里产生的差异保存到临时文件中;2、切换到master分支,将差异应用到master分支上;3、切换回test分支;

注:修改的是test分支,master分支没有变化。

step2:将test分支 rebase master 分支后:

$ git checkout master #切换回master分支;

$ git merge test #合并test分支到master分支,进行一次快进合并

在执行git rebase时,同时修改了同一文件的某一行或几行,可能会发生冲突。 冲突发生时,工作空间处于no branch的状态。

冲突解决:

用vi 编辑文件,找到<<<和>>>的冲突标记,解决冲突,然后删除掉冲突标记;

解决完冲突后,git add 文件,然后执行git rebase – – continue, 继续衍合其余的commit;

在执行git add 后,工作空间处于你所在的分支;如果此时还是no branch状态,说明冲突没有解决彻底;

解决冲突后,不要执行 git commit,否则会在执行git rebase –continue时,提示仍然有冲突,但实际上已经解决完冲突了;如果执行了git commit,那么在提示错误时,执行git rebase — skip , 忽略此次冲突提示

3、采用cherry-pick的方式将test分支的修改合并到master分支上:git cherry-pick sha1

关于cherry-pick: cherry-pick 可应用于同一远程库不同分支的提交,也可用于不同远程库的分支,需在本地工作空间中添加远程库,fetch远程库的数据到本地库 。

$ git checkout master # 切换到master分支 ;

$ git cherry-pick C3-SHA1 # 合并test分支的C3提交到master分支 ;

$ git branch –d test # 合并完成后,可以删除test分支

GIT基本命令讲解

今天的文章GIT基本命令讲解分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/7923.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注