zoukankan      html  css  js  c++  java
  • Git入门详解

    查看分支:git branch

    创建分支:git branch <name>

    切换分支:git checkout <name>

    创建+切换分支:git checkout -b <name>

    合并某分支到当前分支:git merge <name>

    删除分支:git branch -d <name>

    一、git的简介

      git是linux用两个月的时间用C语言写的一个分布版本控制系统。

      版本控制系统主要有三种:本地版本控制系统、集中化版本控制系统、分布式版本控制系统。下面说下集中式版本控制系统与分布式版本控制系统的区别:集中式版本控制系统,版本库集中放在中央服务器上,开发人员是在自己的电脑上开发,所以需要从中央服务器获取代码,开发完毕再推送到中央服务器。主要缺点是必须有网的时候才可以使用;网慢,拉取推送速度慢;如果服务器上版本库出问题大家都不可以用了。分布式版本控制系统,根本没有“中央服务器”,因为每一台电脑都有完整的版本库,开发人员在各自的电脑上修改代码,然后推送给其他电脑,这样就能互相看到最新版本的代码,但实际工作中一般不会两两之间进行推送拉取,而是把其中一台电脑充当”中央服务器“,这样方便大家交换修改的代码;不需要网络也能交换代码;git强大的分支功能也是最要人陶醉的,建立分支,对这个分支进行修改,而不改变主支上的代码!

      分布式版本控制系统除了Git以及促使Git诞生的BitKeeper外,还有类似Git的Mercurial和Bazaar等。这些分布式版本控制系统各有特点,但最快、最简单也最流行的依然是Git!

      git术语:

      仓库(repository):一个仓库包括了所有的版本信息、所有的分支和标记信息。在Git中仓库的每份拷贝都是完整的。仓库让你可以从中取得你的工作副本。

      分支(branches):一个分支意味着一个独立的、拥有自己历史信息的代码线。你可以从已有的代码中生成一个新的分支,这个分支与剩余分支完全独立。默认的分支往往是叫master。用户可以选择一个分支,选择一个分支叫checkout。

      标记(tags):一个标记指的是某个分支某个特定时间的状态。通过标记可以很方便的切换到标记时的状态,例如2009年5月22

      提交(commit):提交代码后,仓库会创建一个新的版本。这个版本可以再后续被重新获得。每次提交都包括作者和提交者,作者和提交者可以是不同的人。

      URL:用来标识一个仓库的位置。

      修订(revision):用来表示代码的一个版本状态。git通过用SHA1 hash算法表示的id来标识不同的版本。每一个 SHA1 id都是160位长,16进制标识的字符串.最新的版本可以通过HEAD来获取.之前的版本可以通过"HEAD~1"来获取,以此类推。

    二、git目标特点
    git目标:快、分布式、上千个并行开发的分支、设计简单、高效管理超大规范项目

    git特点:直接记录快照,而非差异比较;几乎所有操作都是本地执行;时刻保持数据的完整性;多数操作仅添加数据;文件有三种状态。

    文件状态周期:

    三、git的配置

    命令:git config

    1. /etc/gitconfig
    2. ~/.gitconfig
    3. .git/gitconfig

    配置用户信息

    $ git config --global user.name "Your name"

    $ git config --global user.email YourName@example.com

    # Set default so that all changes are always pushed to the repository

    git config --global push.default "matching"

    查看配置信息
    $ git config -l

    以下命令会为终端配置高亮

    git config --global color.status auto

    git config --global color.branch auto

    - 配置代理

    git config --global http://proxy.yourname.com:8080
    

    如果需要用户名密码的话,则设置:

    git config –global http.proxy http://user:password@proxy.yourname.com:8080
    

    其中 user 和 password 分别为你的用户名和密码。

    设置完成后,可以通过如下命令来查看设置是否生效:

    git config –get –global http.proxy
    

    如果某一天你不喜欢她了,需要删除代理设置,那么可以使用:

    git config --system (或 --global 或 --local) --unset http.proxy
    

    来删除设置

    四、获取git仓库

    版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。每个Git仓库都是放置在.git文件夹下.这个目录包含了仓库的所有历史记录,.git/config文件包含了仓库的本地配置。

    创建仓库

    $ mkdir learngit
    $ cd learngit
    $ pwd    #pwd命令用于显示当前目录。在我的Mac上,这个仓库位于/Users/michael/learngit

    初始化新仓库

    $ git init   #瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。

    $ git add somefile
    $ git commit -m 'init project'  #简单解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。

    为什么Git添加文件需要addcommit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:

    $ git add file1.txt
    $ git add file2.txt file3.txt
    $ git commit -m "add 3 files."

    克隆已有仓库
    $ git clone git://github.com/xx/example.git 或 $ git clone d:/learngit

    Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。

    五、git - 添加

    git add somefile

    1. 跟踪新⽂文件
    2. 暂存已更改⽂文件
    3. 标记冲突⽂文件为已解决状态

    六、git - 忽略文件

    .gitignore

    #这⾏行是注释
    node_modules #忽略所有node_modules目录
    /node_modules #仅仅忽略根目录下的node_modules目录
    temp/ #忽略temp目录下的所有⽂文件
    doc/*.txt #忽略doc目录下的.txt⽂文件,但不包含doc⼦子目录的.txt⽂文件
    *.txt #忽略所有.txt⽂文件
    !readme.txt #readme.txt除外

    忽略文件的原则是:

    1. 忽略操作系统自动生成的文件,比如缩略图等;
    2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
    3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

    七、git - 提交

    - git commit 启动编辑器输⼊入提交说明
    - git commit -m "***"  '本次提交说明'
    - git commit -am "***"  跳过使用暂存区(即跳过git add)

    八、git - 差异

    - git status 列出修改过的⽂文件
    - git diff 查看⼯工作目录和暂存区快照之间的差异
    - git diff --staged 查看暂存区快照和上次提交快照之间的差异

    九、git - 删除

    - rm somefile.txt ⼿手⼯工删除
    - git rm somefile.txt 删除未提交到暂存区的⽂文件
    - git rm -f somefile.txt 强制删除已提交到暂存区的⽂文件
    - git rm --cached somefile.txt 从暂存区移除,但不删除

    十、git - 移动

    - git mv somefile.txt otherfile.txt
    相当于:
    mv somefile.txt otherfile.txt
    git rm somefile.txt
    git add otherfile.txt

    十一、git - 日志

    每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作.

    - git log 所有log

    - git log --pretty=oneline   如果嫌输出信息太多,看得眼花缭乱的

    - git log -p -5   显示最近5次更新,并显示差异

    你看到的一大串类似3628164...882e1e0的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。

    十二、git - 撤销

    每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线:

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

    - 回退到上一个版本

    git reseet --hard HEAD^

    - 查看文件

    cat somefile

    还可以继续回退到上一个版本,不过且慢,然我们用git log再看看现在版本库的状态,最新的那个版本已经看不到了!肿么办?只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个版本的commit id3628164...,于是就可以指定回到未来的某个版本:

    - 制定某个版本

    git reset --hard 3628164

    Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL。然后顺便把工作区的文件更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位在哪。

    现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?Git提供了一个命令git reflog用来记录你的每一次命令。

    - 记录每一次命令

    git reflog

    - 修改最后⼀一次提交
    git commit --amend
    - 取消已暂存的⽂文件,把暂存区的修改撤销掉,重新放回工作区
    git reset HEAD somefile
    - 把文件在工作区的修改全部撤销
    git checkout -- somefile

    十三、git - 分支

    十四、创建分支

    创建dev分支,然后切换到dev分支

    $ git checkout -b dev
    或者
    $ git branch dev
    $ git checkout dev
     

    十五、切换分支

    -切换回master分支

    git checkout master

    十六、git - 移动指针

    git commit -m ‘change it’

    十七、git - 分支历史

    git checkout master
    vim index.html
    git commit -m ‘change’

    十八、git - 合并

    git checkout master
    git merge dev

    git merge --no-ff -m "merge with no-ff" dev   #强制禁用Fast forward模式

    合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

    十九、git - 冲突

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

    git log -graph --pretty=oneline --abbrev-commit  查看分支的合并情况

    二十、git - 分支管理

    - 查看分支  git branch [-v]

    - 查看合并的分支  git branch --merged

    - 查看尚未合并的分支  git branch --no-merged

    - 删除分支  git branch -d dev

    - 强行删除分支  git branch -D dev

    二十一、git bug 分支

    工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?

    - 把当前工作现场“储藏”起来,等以后恢复现场后继续工作 

    git stash

    bug修改完了,返回去工作,工作区是干净的,

    - 查看stash

    git stash list

    工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:

    一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;

    另一种方式是用git stash pop,恢复的同时把stash内容也删了:

    - 你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash

    git stash apply stash@{0}

    二十一、git - 远程仓库

    - 查看
    git remote [-v]
    - 添加
    git add [shortname] url
    - 抓取数据
    git fetch [remote-name]
    git pull [remote-name]

    - 推送数据
    git push [remote-name] [branch-name]

    - 查看仓库信息
    git remote show [remote-name]

    - 重命名
    git remote rename new-name old-name
    - 移除
    git remote rm remote-name

    二十二、git - 标签

    - 查看现有标签
    git tag
    - 新建
    git tag -a v0.1.2 -m ‘version 0.1.2’
    - 查看标签
    git show v0.1.2
    git tag v0.1.2

    - 找到历史提交的commit id

    git log --pretty=oneline --abbrev-commit

    - 后期加标签
    git tag -a v0.1.2 -m 89ah87w6w8

    还可以通过-s用私钥签名一个标签:

    git tag -s v0.2 -m "signed version 0.2 released" fec145a

    签名采用PGP签名,因此,必须首先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错,如果报错,请参考GnuPG帮助文档配置Key。

    -删除标签

    git tag -d v1.0

    - 分享标签,推送某个标签到远程
    git push remote-name v0.1.2
    git push remote-name --tags

    二十三、使用git

    打开开源项目的网址,fork到自己的账号上,在自己的账号上clone仓库到本地,然后可以干活,干完活推送到自己的github仓库,如果想往官方库推送,可以在github上发起一个pull request,对方是否接受就不一定了。

    二十四、自定义git

    - 让Git显示颜色,会让命令输出看起来更醒目

    git config --global color.ui true

    - 配置简写

    git config --global alias.st status

    很多人都用co表示checkoutci表示commitbr表示branch

    - 把暂存区的修改撤销掉(unstage),重新放回工作区

    git config --global alias.unstage 'reset HEAD'

    - 显示最后一次提交信息

    git config --global alias.last 'log -1'

    - 丧心病狂地把lg配置成了

    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"

    - 每个仓库的Git配置文件都放在.git/config文件中

    cat .git/config

    - 当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig

    最后、安装git

    1、如果是其他Linux版本,可以直接通过源码安装。先从Git官网下载源码,然后解压,依次输入:./configmakesudo make install这几个命令安装就好了。

    2、在Mac OS X上安装Git

    如果你正在使用Mac做开发,有两种安装Git的方法。

    一是安装homebrew,然后通过homebrew安装Git,具体方法请参考homebrew的文档:http://brew.sh/

    第二种方法更简单,也是推荐的方法,就是直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。

    Xcode是Apple官方IDE,功能非常强大,是开发Mac和iOS App的必选装备,而且是免费的!

    3、在Windows上安装Git

    实话实说,Windows是最烂的开发平台,如果不是开发Windows游戏或者在IE里调试页面,一般不推荐用Windows。不过,既然已经上了微软的贼船,也是有办法安装Git的。

    Windows下要使用很多Linux/Unix的工具时,需要Cygwin这样的模拟环境,Git也一样。Cygwin的安装和配置都比较复杂,就不建议你折腾了。不过,有高人已经把模拟环境和Git都打包好了,名叫msysgit,只需要下载一个单独的exe安装程序,其他什么也不用装,绝对好用。

    msysgit是Windows版的Git,从http://msysgit.github.io/下载,然后按默认选项安装即可。

    安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!

    install-git-on-windows

    安装完成后,还需要最后一步设置,在命令行输入:

    $ git config --global user.name "Your Name"
    $ git config --global user.email "email@example.com"
    

    因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。

    注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

  • 相关阅读:
    LeetCode Subsets II
    LeetCode Rotate Image
    LeetCode Palidrome Number
    LeetCode Generate Parentheses
    LeetCode Maximum Subarray
    LeetCode Set Matrix Zeroes
    LeetCode Remove Nth Node From End of List
    Linux Loop设备 使用
    Linux 文件系统大小调整
    LeetCode N-Queens II
  • 原文地址:https://www.cnblogs.com/jymz/p/4530598.html
Copyright © 2011-2022 走看看