Git学习笔记:(Quick Start)

写在前面

  • VCS中集中式与分布式的差别

    集中式的服务器如果挂了,那么所有人都挂了,因为完整仓库只存在服务器上 ; 而分布式如果github|gitlab挂了 ,你还可以重新建一个服务器,你把任何一个人的仓库clone过去就OK,因为分布式版本控制的每个节点都是一个完整仓库

  • 每个节点都是完整仓库 what mean ?

  1. 每个人(节点)都有自己的历史版本记录
  1. 虽然我们在使用git时也会定义一个用来交换修改的中央仓库,但其实我们在git中把它称为原始库(origin)

Quick Start

from gitlab quick start

  1. Git global setup
git config --global user.name "wesley"
git config --global user.email "wesley.wang@maixian.com"
  1. Git repository
    2.1 Create a new repository
git clone http://wesley@10.1.0.200/wesley/mx-bss.git
cd mx-bss
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master

2.2 Existing folder

cd existing_folder
git init
git remote add origin http://wesley@10.1.0.200/wesley/mx-bss.git
git add .
git commit -m "Initial commit"
git push -u origin master

2.3 Existing Git repository

cd existing_repo
git remote add origin http://wesley@10.1.0.200/wesley/mx-bss.git
git push -u origin --all
git push -u origin --tags

分支管理

  • 创建分支
  • 创建并切换分支。
$ git checkout -b test
  • 开始一项功能的开发工作时,基于develop创建功能分支。
$ git checkout -b myfeature develop
Switched to a new branch "myfeature"
  • master 分支

Git初始化仓库时的默认分支,通常用来作为其它长期分支(develop)的主干。
在Git里,这个分支叫主分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。

  • 删除分支
  • 已经合并的分支
$ git branch --merged
 *master
  temp
 git branch -d branch-name
  • 如果要丢弃一个没有合并的分支
$ git branch --no-merged
$ git branch -D branch-name。//-D可理解为强制
  • 分支模型
成功实践的分支模型

git merge

  1. 合并策略 strategy
  • default
  • resolve
  • recursive
    合并一个分支时默认的合并策略。
  • octopus
    合并多个分支时默认的合并策略。
  • ours
  • subtree
  1. 常用命令和参数释义
  • 把dev分支的工作成果快速合并到当前分支上:
    $ git merge dev

  • $ git merge –no-ff 可以保存你之前的分支历史。能够更好的查看 merge历史,以及branch 状态。
    $ git merge 则不会显示 feature,只保留单条分支记录。
    如图:来自于网络


    no fast-forward vs 快速合并
  • 解决冲突
    当两个需要合并的两个分支上针对同一文件都有各自的修改时,就必须首先解决冲突,解决冲突后,再提交,合并完成 ! 用git log --graph命令可以看到分支合并图。

git diff

  • 查看尚未暂存的文件差异更新
    $ git diff
不加参数直接输入
此命令比较的是工作目录(Working tree)和暂存区域快照(index)之间的差异
也就是修改之后还没有暂存起来的变化内容。
  • 查看已经暂存起来的文件(staged)和上次提交时的快照之间(HEAD)的差异
  $ git diff --cached
  $ git diff --staged
显示的是下一次commit时会提交到HEAD的内容(不带-a情况下)
  • 提交后修订版本,工作区中所有修改的文件
eg. $ git diff  [修订版本如:Head] [-- file]
可以查看工作区和版本库里面最新版本的区别:
$ git diff HEAD -- mx-bss/src/main/webapp/WEB-INF/jsp/platform/oms/order/OrderInfo.jsp
  • 直接将两个分支上最新的提交做diff
  $ git diff temp master 或 git diff temp..master
  • 输出自topic和master分别开发以来,master分支上的changed。
$ git diff topic...master
Changes that occurred on the master branch since when the topic
 branch was started off it
  • 查看简单的diff结果,可以加上--stat参数
    git diff --stat

  • 查看当前目录和另外一个分支的差别
    git diff test

  • 显示当前目录下的lib目录和上次提交之间的差别(更准确的说是在当前分支下)
    git diff HEAD -- ./lib

  • 比较上次提交commit和上上次提交
    git diff HEAD^ HEAD

  • 比较两个历史版本之间的差异
    git diff SHA1 SHA2

  • diff输出格式

版本管理系统git,使用的是合并格式diff的变体。
  $ git diff
显示结果如下:
  diff --git a/f1 b/f1
  index 6f8a38c..449b072 100644
  --- a/f1
  +++ b/f1
  @@ -1,7 +1,7 @@
   a
   a
   a
  -a
  +b
   a
   a
   a
第一行表示结果为git格式的diff。
  diff --git a/f1 b/f1
进行比较的是,a版本的f1(即变动前)和b版本的f1(即变动后)。
第二行表示两个版本的git哈希值(index区域的6f8a38c对象,与工作目录区域的449b072对象进行比较),最后的六位数字是对象的模式(普通文件,644权限)。
  index 6f8a38c..449b072 100644
第三行表示进行比较的两个文件。
  --- a/f1
  +++ b/f1
"---"表示变动前的版本,"+++"表示变动后的版本。
后面的行都与官方的合并格式diff相同。
  @@ -1,7 +1,7 @@
   a
   a
   a
  -a
  +b
   a
   a
   a

版本回退 reset

常用命令
  • 把暂存区的修改回退到工作区(unstage)
    当我们使用git add file 把工作区文件添加到暂存区时 。 这时git就会告诉我们:
(use "git reset HEAD <file>..." to unstage) //可以把暂存区的文件拉回工作区

git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

  • git reset
    git reset --hard HEAD^ (HEAD指向的版本就是当前版本,HEAD表示上一版本,HEAD^表示上上版本balabala)
  1. --hard表示强制回退
  • git reflog用来记录你的每一次命令
    因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
    版本回退前,用git log可以查看提交历史,以便确定要回退到哪个版本。
    要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
使用场景
  1. 只是修改了工作区某个文件的内容:
    想直接丢弃工作区的修改时,用命令git checkout -- file。

  2. 当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。

  3. 已经提交到版本库时:
    想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

储存现场

相关命令
  1. 存储现场 git stash
git stash: 从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时将当前的工作区内容保存到Git栈中。
git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理。
git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
git stash clear: 清空Git栈。
  1. 查看工作现场 git stach list

我们进行存储工作现场后,发现工作的内容被git藏起来了,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:参考(3. 恢复现场)

  1. 恢复现场

恢复现场有两种方式:
1)使用git stash apply 来恢复,然后再使用git stash drop来删除stash的内容。如果要多次使用stash,恢复的时候先用git stash list查看,然后在指定你要恢复的内容:git stash apply stash@{0}。
2) 使用git stash pop,来恢复并删除stash内容。
咱们一般为了方便,就直接用git stash pop了

使用场景

<a>使用git的时候,我们往往使用branch解决任务切换问题:</a>
 1) 一言不合(紧急任务或bug)就提交是不好的
  例如,我们往往会建一个自己的分支去修改和调试代码, 如果别人或者自己发现原有的分支上有个不得不修改的bug,我们往往会把完成一半的代码 commit提交到本地仓库,然后切换分支去修改bug,改好之后再切换回来。这样的话往往log上会有大量不必要的记录。
  其实如果我们不想提交完成一半或者不完善的代码,但是却不得不去修改一个紧急Bug,那么使用'git stash'就可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区和上一次提交的内容是完全一样的,所以你可以放心的修 Bug,等到修完Bug,提交到服务器上后,再使用'git stash apply'将以前一半的工作应用回来。
 2) 可以多次将未提交的代码压入到栈中
  也许有的人会说,那我可不可以多次将未提交的代码压入到栈中?答案是可以的。当你多次使用'git stash'命令后,你的栈里将充满了未提交的代码,这时候你会对将哪个版本应用回来有些困惑,'git stash list'命令可以将当前的Git栈信息打印出来,你只需要将找到对应的版本号,例如使用'git stash apply stash@{1}'就可以将你指定版本号为stash@{1}的工作取出来,当你将所有的栈都应用回来的时候,可以使用'git stash clear'来将栈清空。
  3) 以一言以蔽之
  当前工作区内容已被修改,但是并未完成。这时Boss来了,说前面的分支上面有一个Bug,需要立即修复。可是我又能提交目前不完美的修改。但是,不提交的话,又没有办法checkout到前面的分支。此时用Git Stash就相当于备份工作区了。然后在Checkout过去修改,这样就能够达到保存当前工作区的同时又能及时恢复。

git 配置别名 alias

  1. 当然是和配置用户信息一样 用--global啦, --global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用
  2. 常用alias
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
// 命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区。既然是一个unstage操作,就可以配置一个unstage别名
git config --global alias.unstage 'reset HEAD'
// 配置一个git last,让其显示最后一次提交信息
git config --global alias.last 'log -1' 
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

Window 下使用Git常见问题

1. warning: LF will be replaced by CRLF

原因分析:

CRLF -- Carriage-Return Line-Feed 回车换行
就是回车(CR, ASCII 13, \r) 换行(LF, ASCII 10, \n)。
这两个ACSII字符不会在屏幕有任何输出,但在Windows中广泛使用来标识一行的结束。而在Linux/UNIX系统中只有换行符。
也就是说在windows中的换行符为 CRLF, 而在linux下的换行符为:LF
使用git来生成一个工程后,文件中的换行符为LF, 当执行git add .时,系统提示:LF 将被转换成 CRLF

解决方法:

删除.git文件

$ rm -rf .git  
$ git config --gobal core.autocrlf false  

这样系统就不会去进行换行符的转换了

特别鸣谢

廖雪峰的官网
git-scm
gitlab
一个成功的分支模型

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • 每个平凡的自我 都曾幻想过 然而大多的自我 都紧抓着 某个理由 每个渺小的理由 都困住自由
    小冷小姐阅读 611评论 7 4
  • 张裕解百纳,广告上经常看见。 张裕是sei呀? No no no ,张裕其实并不是人名。张裕是一个企业,其创办人是...
    penny胖妮阅读 468评论 2 0
  • 一、常见的DDL(data definition language)语句 1、use 数据库名称:使用数据库,用于...
    转身后的那一回眸阅读 205评论 0 0
  • 因为希望,所以努力。 因为努力,所以失望。
    dahyw阅读 179评论 0 0