Git学习总结

来源:互联网 发布:java所有关键字 编辑:程序博客网 时间:2024/05/16 01:25

命令总结:

  • git init-变成Git可以管理的仓库
  • git add readme.txt-添加到仓库
  • git commit -m “任务XX”-提交到仓库
  • git status-仓库当前的状态
  • git diff-查看difference
  • git log-从最近到最远的提交日志
  • cat readme.txt-查看某一文件
  • git reset –hard HEAD^-退回上一个版本
  • git reflog-记录每一次的命令
  • git checkout – file - 可以丢弃工作区的修改
  • git reset HEAD readme.txt - 把暂存区的修改撤销掉并放回工作区
  • git push -u origin master - 将本地库推送到空的远程库分支
  • git push origin master - 把本地master分支的最新修改推送至远程库
  • git remote add origin git@github.com:XXX/XX.git - 把本地仓库的内容推送到GitHub仓库
  • git clone git@github.com:XXX/XX.git - 克隆一个本地库
  • git checkout -b XX - 创建并切换到新分支
  • git branch - 查看当前分支状况
  • git checkout XXX - 切换到XXX分支
  • git merge XX - 把XX分支的工作成果合并到当前分支上
  • git branch -d XX - 删除XX分支
  • git branch -D XX - 强行删除未合并分支
  • git branch - 创建分支
  • git log –graph - 查看分支合并图
  • git merge –no-ff -m “AAA”BB - 禁用Fast forward合并分支,创建了一个新的commit
  • git stash - 存储当前工作现场
  • git stash list - 查看存储的工作现场
  • git stash apply - 恢复工作现场但不删除stash
  • git stash drop - 删除stash
  • git stash pop - 恢复工作现场并删除stash
  • -

入门

  1. Ubuntu Linux可通过一条sudo apt-get install git就可以直接完成Git的安装
  2. 集中式的服务器挂了所有人都挂了,因为完整仓库只存在服务器上,分布式如果github挂了你可以重新建一个服务器,然后把任何一个人的仓库clone过去

一句话总结:分布式版本控制的每个节点都是完整仓库

创建版本库

首先,选择一个合适的地方,创建一个空目录:

$ mkdir learngit$ cd learngit$ pwd/Users/michael/learngit

第二步,通过git init命令把这个目录变成Git可以管理的仓库:

$ git initInitialized empty Git repository in /Users/michael/learngit/.git/

编写一个readme.txt文件,内容如下:

Git is a version control system.Git is free software.

放到learngit目录下(子目录也行)
一个文件放到Git仓库只需要两步:第一步,用命令git add告诉Git,把文件添加到仓库:

$ git add readme.txt

执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。

第二步,用命令git commit告诉Git,把文件提交到仓库:

$ git commit -m "wrote a readme file"[master (root-commit) cb926e7] wrote a readme file 1 file changed, 2 insertions(+) create mode 100644 readme.txt

git commit命令执行成功后会告诉你,1个文件被改动(我们新添加的readme.txt文件),插入了两行内容(readme.txt有两行内容)。

时光机穿梭

修改readme.txt文件,改成如下内容:

Git is a distributed version control system.Git is free software.

运行git status命令看看结果:

C:\Users\kai\Documents\try [master]> git statusOn branch masterChanges not staged for commit:  (use "git add <file>..." to update what will be committed)  (use "git checkout -- <file>..." to discard changes in working directory)        modified:   readme.txtno changes added to commit (use "git add" and/or "git commit -a")C:\Users\kai\Documents\try [master +0 ~1 -0]>

git status命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,readme.txt被修改过了,但还没有准备提交的修改。

虽然Git告诉我们readme.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的。用git diff这个命令可以看看:

C:\Users\kai\Documents\try [master +0 ~1 -0]> git diffdiff --git a/readme.txt b/readme.txtindex d8036c1..013b5bc 100644--- a/readme.txt+++ b/readme.txt@@ -1,2 +1,2 @@-Git is a version control system.+Git is a distributed version control system. Git is free software.\ No newline at end of file

git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到,我们在第一行添加了一个“distributed”单词。

知道了对readme.txt作了什么修改后,再把它提交到仓库就放心多了,提交修改和提交新文件是一样的两步,先add后commmit。
提交后,我们再用git status命令看看仓库的当前状态:

C:\Users\kai\Documents\try [master]> git statusOn branch masternothing to commit, working directory clean

Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(working directory clean)的。

在Git中,我们用git log命令查看:

$ git logcommit 3628164fb26d48395383f8f31179f24e0882e1e0Author: Michael Liao <askxuefeng@gmail.com>Date:   Tue Aug 20 15:11:49 2013 +0800    append GPLcommit ea34578d5496d7dd233c827ed32a8cd576c5ee85Author: Michael Liao <askxuefeng@gmail.com>Date:   Tue Aug 20 14:53:12 2013 +0800    add distributedcommit cb926e7ea50ad11b8f9e909c05226233bf755030Author: Michael Liao <askxuefeng@gmail.com>Date:   Mon Aug 19 17:51:55 2013 +0800    wrote a readme file

git log命令显示从最近到最远的提交日志,我们可以看到3次提交。
注:一大串类似3628164…882e1e0的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示。

在Git中,用HEAD表示当前版本,也就是最新的提交3628164…882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

版本回退

现在,我们要把当前版本“append GPL”回退到上一个版本“add distributed”,就可以使用git reset命令:

$ git reset --hard HEAD^HEAD is now at ea34578 add distributed

如果想再回去,可以找到那个append GPL的commit id是3628164…,于是就可以指定回到未来的某个版本:

$ git reset --hard 3628164HEAD is now at 3628164 append GPL

版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。

找不到新版本的commit id怎么办?

在Git中,总是有后悔药可以吃的。当你用$ git reset –hard HEAD^回退到add distributed版本时,再想恢复到append GPL,就必须找到append GPL的commit id。Git提供了一个命令git reflog用来记录你的每一次命令:

C:\Users\kai\Documents\try [master]> git reflog08276d1 HEAD@{0}: reset: moving to HEAD^4db8620 HEAD@{1}: commit: append GPL08276d1 HEAD@{2}: commit: add distributed9b75342 HEAD@{3}: commit (initial): wrote a readme file

工作区和暂存区

  1. 工作区(Working Directory):就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区;
  2. 版本库(Repository):工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
  3. 我们把文件往Git版本库里添加的时候,是分两步执行的:
    1. 第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
    2. 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
      这里写图片描述
  4. 原理:我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
  5. 总结:git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。
$ git commit -m "understand how stage works"[master 27c9860] understand how stage works 2 files changed, 675 insertions(+) create mode 100644 LICENSE

这里写图片描述

管理修改

Git之所以比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。

即,修改文件后,必须使用用git add命令后,修改才会被放入暂存区,才可以进行commit。git commit只负责把暂存区的修改提交。

撤销修改

第一种情况

git checkout – file可以丢弃工作区的修改:

git checkout -- readme.txt

命令git checkout – readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commit或git add时的状态。

第二种情况

若已经git add到暂存区了,用git status查看一下,修改只是添加到了暂存区,还没有提交:

# On branch master# Changes to be committed:#   (use "git reset HEAD <file>..." to unstage)##       modified:   readme.txt#

Git同样告诉我们,用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区:

$ git reset HEAD readme.txtUnstaged changes after reset:M       readme.txt

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

远程仓库

先添加SSH,在github创建新的项目,之后输入git remote add origin git@github.com:michaelliao/learngit.git 关联这两个库。远程库的名字就是origin,这是Git默认的叫法。

下一步,就可以把本地库的所有内容推送到远程库上:

C:\Users\kai\Documents\try [master +0 ~1 -0]> git push -u origin masterCounting objects: 9, done.Delta compression using up to 4 threads.Compressing objects: 100% (6/6), done.Writing objects: 100% (9/9), 806 bytes | 0 bytes/s, done.Total 9 (delta 0), reused 0 (delta 0)To https://github.com/kkevinyang/learngit.git * [new branch]      master -> masterBranch master set up to track remote branch master from origin.

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

从现在起,只要本地作了提交,就可以通过命令:

$ git push origin master

把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!

分支管理

在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。

一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点。

当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上。从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变。

假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并。

所以Git合并分支也很快!就改改指针,工作区内容也不变!

合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支。

我们创建dev分支,然后切换到dev分支:

$ git checkout -b devSwitched to a new branch 'dev'

然后,用git branch命令查看当前分支:

$ git branch* dev  master

当前分支前面会标一个*号,然后,我们就可以在dev分支上正常提交。对readme.txt做个修改,加上一行后提交。之后就可以切换回master分支:

$ git checkout masterSwitched to branch 'master'

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容

分支策略

  1. 首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活。
  2. 干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
  3. 你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

Bug分支

每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作。
即总结为:
1. 修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除
2. 当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 你的孩子怎么办 英文 头发掉在地上怎么办 行李箱轮子太响怎么办 货车横拉杆弯怎么办 拉杆轮子坏了怎么办 外拉杆球头旷了怎么办 古早味蛋糕回缩怎么办 孩子迷上嘻哈怎么办 吃扇贝过敏了怎么办 海鲜和杨梅一起怎么办 我买东西没眼光怎么办 兔子身上有跳蚤怎么办 物业不提供发票怎么办 购房发票 不给怎么办 新锐大灯光散不聚怎么办 网络碰到垃圾人怎么办 有人侮辱我家人怎么办 亲人欠网贷还不上现在病重怎么办 亲人欠网贷现在病重怎么办 小孩子大嘴巴病怎么办 小孩子有心胀病怎么办 小孩子有胃痛病怎么办 大修基金用完了怎么办 基金买错了怎么办 基金公司倒闭了怎么办 桔子分期有风险怎么办 想买vivox21没钱怎么办 中介收钱不办事怎么办 手机应用程序几个运行怎么办 网上彩票是骗局怎么办 辞职后不想辞职怎么办 口头辞职后悔了怎么办 纸质承兑丢了怎么办 天天利财倒闭怎么办 网络理财平台诈骗怎么办 银行理财产品到期后怎么办 30岁没工作怎么办 理财投资被骗了怎么办 支付宝不想收钱怎么办 信融财富逾期怎么办 拼多多砍价上限怎么办