Git初始配置和基本使用

 Git初始配置和基本使用

在学习完本文以后,你应该可以配置并初始化一个仓库(repository)、开始或中止跟踪(track)文件、暂存(stage)或提交(commit)更改。 本章也将向你演示如何配置 Git 来忽略指定的文件和文件模式、如何迅速而简单地撤销错误操做、如何浏览你的项目的历史版本以及不一样提交(commits)间的差别、如何向你的远程仓库推送(push)以及如何从你的远程仓库拉取(pull)文件。html

初次运行Git前的配置

用户信息

当安装完 Git 应该作的第一件事就是设置你的用户名称与邮件地址。 这样作很重要,由于每个 Git 的提交都会使用这些信息,而且它会写入到你的每一次提交中,不可更改:git

  1.  
    $ git config --global user .name "Junk Chen"
  2.  
    $ git config --global user .email junkchen@vip.qq.com

 

“Junk Chen”是你本身设置的名字,junkchen@vip.qq.com是你的邮箱地址。github

再次强调,若是使用了 –global 选项,那么该命令只须要运行一次,由于以后不管你在该系统上作任何事情,Git 都会使用那些信息。当你想针对特定项目使用不一样的用户名称与邮件地址时,能够在那个项目目录下运行没有 –global 选项的命令来配置。正则表达式

不少 GUI 工具都会在第一次运行时帮助你配置这些信息。shell

检查配置信息

若是想要检查你的配置,可使用 git config –list 命令来列出全部 Git 当时能找到的配置。安全

  1.  
    $ git config --list
  2.  
    core.autocrlf=true
  3.  
    color.diff=auto
  4.  
    color.status=auto
  5.  
    color.branch=auto
  6.  
    help.format=html
  7.  
    user.name=JunkChen
  8.  
    user.email=junkchen@vip.qq.com
  9.  
     

你能够经过输入 git config : 来检查 Git 的某一项配置:ruby

  1.  
    $ git config user.name
  2.  
    Junk Chen

获取帮助

若你使用Git时须要获取帮助,有三种方法能够找到Git命令的使用手册:bash

  1.  
    $ git help <verb>
  2.  
    $ git <verb> --help
  3.  
    $ man git-<verb>

 

如想要得到config命令的手册,可执行:服务器

$ git help config

这些命令很棒,由于你随时随地可使用而无需联网。网络

安装和初始配置都已经设置好了,下面就来看看具体的应用了。

获取Git仓库

两种获取Git项目仓库的方法: 一是在现有项目或目录下导入全部文件到Git中; 二是从一个服务器克隆一个现有的Git仓库。

在现有目录中初始化仓库

进入该项目目录并输入:

$ git init

该命令将建立一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中全部的必须文件,这些文件是 Git 仓库的骨干。

克隆现有的仓库

若是你想得到一份已经存在了的Git仓库的拷贝,可使用git clone [url]。

$ git clone https://github.com/libgit2/libgit2

 

该命令执行后会在当前目录下建立一个名为 “libgit2” 的目录,并在在这个目录下初始化一个.git文件夹,从远程仓库拉取全部的数据放在改文件夹,而后从中读取最新版本的文件的拷贝。 若是你进入到这个新建的 libgit2 文件夹,你会发现全部的项目文件已经在里面了,准备就绪等待后续的开发和使用。 请将 https://github.com/libgit2/libgit2 替换为你本身的Git仓库地址。

$ git clone https://github.com/libgit2/libgit2 mylibgit

 

这将执行与上一个命令相同的操做,不过在本地建立的仓库名字变为 mylibgit。

Git 支持多种数据传输协议。 上面的例子使用的是https:// 协议,不过你也可使用 git:// 协议或者使用SSH 传输协议,好比 user@server:path/to/repo.git 。

记录每次更新到仓库

如今咱们有了一个真实项目的 Git 仓库,并从这个仓库中取出了全部文件的工做拷贝。 当咱们对文件作了些修改,在完成一个阶段的目标后,就提交本次更新到仓库。

请记住,你工做目录下的每个文件都不外乎这两种状态:已跟踪或未跟踪。 已跟踪的文件是指那些被归入了版本控制的文件,在上一次快照中有它们的记录,在工做一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。 工做目录中除已跟踪文件之外的全部其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。 初次克隆某个仓库的时候,工做目录中的全部文件都属于已跟踪文件,并处于未修改状态。

编辑过某些文件以后,因为自上次提交后你对它们作了修改,Git 将它们标记为已修改文件。 咱们逐步将这些修改过的文件放入暂存区,而后提交全部暂存了的修改,如此反复。

检查当前文件的状态

查看文件处于什么状态:

$ git status

 

跟踪新文件

若是咱们的工做目录中建立了新的文件,可以使用git add开始跟踪一个文件。如跟踪 READEME.txt 文件:

$ git add READEME.txt

 

此时再运行 git status 命令,会看到 README 文件状态已发生改变。

git add 命令使用文件或目录的路径做为参数;若是参数是目录的路径,该命令将递归地跟踪该目录下的全部文件。

暂存已修改文件

当一个已被跟踪的文件每次被修改后,须要使用 git add 把最新版本添加到暂存区方可进行提交更新,不然不会提交本次更改到仓库中。如 READEME.txt 文件被修改后添加暂存:

$ git add READEME.txt

 

git add 是个多功能命令:能够用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。可理解为 “添加内容到下一次提交中”。

查看已暂存和未暂存的修改

若是 git status 命令的输出对于你来讲过于模糊,你想知道具体修改了什么地方,能够用 git diff 命令。

$ git diff

 

此命令比较的是工做目录中当前文件和暂存区域快照之间的差别, 也就是修改以后尚未暂存起来的变化内容。

若要查看已暂存的将要添加到下次提交里的内容,能够用 git diff –cached 命令。(Git 1.6.1 及更高版本还容许使用 git diff –staged,效果是相同的,但更好记些。)

git diff 自己只显示还没有暂存的改动,而不是自上次提交以来所作的全部改动。 因此有时候你一会儿暂 
存了全部更新过的文件后,运行 git diff 后却什么也没有,就是这个缘由。

提交更新

当使用 git add 添加到暂存区后,就能够提交到仓库了。在此以前,请必定要确认还有什么修改过的或新建的文件尚未 git add 过,不然提交的时候不会记录这些尚未暂存起来的变化。这些修改过的文件只保留在本地磁盘。因此,每次准备提交前,先用 git status 看下,是否是都已暂存起来了,而后在运行提交命令 git commit :

$ git commit -m "Input your commit message"

 

使用 -m 选项,添加提交信息。

到此,使用 Git 就完成了,初始化仓库、添加文件、提交更新到仓库的全过程。

跳过使用暂存区

尽管使用暂存区域的方式能够精心准备要提交的细节,但有时候这么作略显得繁琐。 Git 提供了一个跳过使用暂存区域的方式,只要在提交的时候,给 git commit 加上 -a 选项,Git就会自动把全部已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤。

$ git commit -a -m "Commit message"

 

移除文件

要从 Git 中移除某个文件,就必需要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),而后提交。 能够用 git rm 命令完成此项工做,并连带从工做目录中删除指定的文件,这样之后就不会出如今未跟踪文件清单中了。

$ git rm <finame>

 

下一次提交时,该文件就再也不归入版本管理了。 若是删除以前修改过而且已经放到暂存区域的话,则必需要用强制删除选项 -f(译注:即 force 的首字母)。 这是一种安全特性,用于防止误删尚未添加到快照的数据,这样的数据不能被 Git 恢复。

另一种状况是,咱们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然但愿保留在当前工做目录中。 换句话说,你想让文件保留在磁盘,可是并不想让 Git 继续跟踪。 当你忘记添加 .gitignore 文件,不当心把一个很大的日志文件或一堆 .a 这样的编译生成文件添加到暂存区时,这一作法尤为有用。 为达到这一目的,使用 –cached 选项:

$ git rm --cached README

 

git rm 命令后面能够列出文件或者目录的名字,也可使用 glob 模式。 比方说:

$ git rm log/\*.log

 

注意到星号 * 以前的反斜杠 \, 由于 Git 有它本身的文件模式扩展匹配方式,因此咱们不用 shell 来帮忙展开。此命令删除 log/ 目录下扩展名为 .log 的全部文件。 相似的好比:

$ git rm \*~

 

该命令为删除以 ~ 结尾的全部文件。

移动文件

不像其它的 VCS 系统,Git 并不显式跟踪文件移动操做。 若是在 Git 中重命名了某个文件,仓库中存储的元数据并不会体现出这是一次更名操做。 不过 Git 很是聪明,它会推断出究竟发生了什么。

既然如此,当你看到 Git 的 mv 命令时必定会困惑不已。 要在 Git 中对文件更名,能够这么作:

$ git mv file_from file_to

 

它会恰如预期般正常工做。 实际上,即使此时查看状态信息,也会明白无误地看到关于重命名操做的说明:

  1.  
    $ git mv README.md README
  2.  
    $ git status
  3.  
    On branch master
  4.  
    Changes to be committed:
  5.  
    ( use "git reset HEAD <file>..." to unstage)
  6.  
    renamed: README.md -> README

 

其实,运行 git mv 就至关于运行了下面三条命令:

  1.  
    $ mv README.md README
  2.  
    $ git rm README.md
  3.  
    $ git add README

 

如此分开操做,Git 也会意识到这是一次更名,因此无论何种方式结果都同样。 二者惟一的区别是,mv 是一条命令而另外一种方式须要三条命令,直接用 git mv 轻便得多。不过有时候用其余工具批处理更名的话,要记得在提交前删除老的文件名,再添加新的文件名。

忽略文件

通常咱们总会有些文件无需归入 Git 的管理,也不但愿它们总出如今未跟踪文件列表。 一般都是些自动生成的文 
件,好比日志文件,或者编译过程当中建立的临时文件等。 在这种状况下,咱们能够建立一个名为 .gitignore 
的文件,列出要忽略的文件模式。 来看一个实际的例子:

  1.  
    $ cat .gitignore
  2.  
    *.[oa]
  3.  
    *~

 

第一行告诉 Git 忽略全部以 .o 或 .a 结尾的文件。第二行告诉 Git 忽略全部以波浪符(~)结尾的文件,许多文本编辑软件(好比 Emacs)都用这样的文件名保存副本。此外,你可能还须要忽略 log,tmp 或者 pid 目录,以及自动生成的文档等等。 要养成一开始就设置好.gitignore 文件的习惯,以避免未来误提交这类无用的文件。

文件 .gitignore 的格式规范以下:

  • 全部空行或者以 # 开头的行都会被 Git 忽略。
  • 可使用标准的 glob 模式匹配。
  • 匹配模式能够以(/)开头防止递归。
  • 匹配模式能够以(/)结尾指定目录。
  • 要忽略指定模式之外的文件或目录,能够在模式前加上惊叹号(!)取反。

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。

查看提交历史

在提交了若干更新后,想回顾下提交历史,可以使用 git log 命令。

$ git log

 

撤销操做

在任何一个阶段,你都有可能想要撤消某些操做。 这里,咱们将会学习几个撤消你所作修改的基本工具。 注意,有些撤消操做是不可逆的。 这是在使用 Git 的过程当中,会由于操做失误而致使以前的工做丢失的少有的几个地方之一。

有时候咱们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,能够运行带有 –amend 选项的提交命令尝试从新提交:

$ git commit --amend

 

这个命令会将暂存区中的文件提交。 若是自上次提交以来你还未作任何修改(例如,在上次提交后立刻执行了此命令),那么快照会保持不变,而你所修改的只是提交信息。

文本编辑器启动后,能够看到以前的提交信息。 编辑后保存会覆盖原来的提交信息。

例如,你提交后发现忘记了暂存某些须要的修改,能够像下面这样操做:

  1.  
    $ git commit -m 'initial commit'
  2.  
    $ git add forgotten_file
  3.  
    $ git commit --amend

 

最终你只会有一个提交 - 第二次提交将代替第一次提交的结果。

取消暂存文件

如何操做暂存区域与工做目录中已修改的文件, 这些命令在修改文件状态的同时,也会提示如何撤消操做。 例如,你已经修改了两个文件而且想要将它们做为两次独立的修改提交,可是却意外地输入了 git add * 暂存了它们两个。 如何只取消暂存两个中的一个呢? git status 命令提示了你:

  1.  
    $ git add *
  2.  
    $ git status
  3.  
    On branch master
  4.  
    Changes to be committed:
  5.  
    ( use "git reset HEAD <file>..." to unstage)
  6.  
    renamed: README.md -> README
  7.  
    modified: CONTRIBUTING.md

 

在 “Changes to be committed” 文字正下方,提示使用 git reset HEAD … 来取消暂存。 因此,咱们能够这样来取消暂存 CONTRIBUTING.md 文件:

  1.  
    $ git reset HEAD CONTRIBUTING.md
  2.  
    Unstaged changes after reset:
  3.  
    MCONTRIBUTING.md
  4.  
    $ git status
  5.  
    On branch master
  6.  
    Changes to be committed:
  7.  
    ( use "git reset HEAD <file>..." to unstage)
  8.  
     
  9.  
    renamed: README.md -> README
  10.  
     
  11.  
    Changes not staged for commit:
  12.  
    ( use "git add <file>..." to update what will be committed)
  13.  
    ( use "git checkout -- <file>..." to discard changes in working
  14.  
    directory)
  15.  
     
  16.  
    modified: CONTRIBUTING.md

 

撤销对文件的修改

若是你并不想保留对 CONTRIBUTING.md 文件的修改怎么办? 你该如何方便地撤消修改 - 将它还原成上次提交时的样子(或者刚克隆完的样子,或者刚把它放入工做目录时的样子)? 幸运的是,git status 也告诉了你应该如何作。 在最后一个例子中,未暂存区域是这样:

  1.  
    Changes not staged for commit:
  2.  
    ( use "git add <file>..." to update what will be committed)
  3.  
    ( use "git checkout -- <file>..." to discard changes in working
  4.  
    directory)
  5.  
    modified: CONTRIBUTING.md

 

它很是清楚地告诉了你如何撤消以前所作的修改。 让咱们来按照提示执行:

  1.  
    $ git checkout -- CONTRIBUTING.md
  2.  
    $ git status
  3.  
    On branch master
  4.  
    Changes to be committed:
  5.  
    ( use "git reset HEAD <file>..." to unstage)
  6.  
     
  7.  
    renamed: README.md -> README

 

能够看到那些修改已经被撤消了。

记住,在 Git 中任何 已提交的 东西几乎老是能够恢复的。 甚至那些被删除的分支中的提交或使用 –amend 选项覆盖的提交也能够恢复。 然而,任何你未提交的东西丢失后极可能再也找不到了。

远程仓库的使用

为了能在任意 Git 项目上协做,你须要知道如何管理本身的远程仓库。远程仓库是指托管在因特网或其余网络中你的项目的版本库。 与他人协做涉及管理远程仓库以及根据须要推送或拉取数据。

查看远程仓库

若是想查看你已经配置的远程仓库服务器,能够运行 git remote 命令。 它会列出你指定的每个远程服务器的简写。 若是你已经克隆了本身的仓库,那么至少应该能看到 origin ,这是 Git 给你克隆的仓库服务器的默认名字:

  1.  
    $ git remote
  2.  
    origin

 

可指定选项 -v,回显示须要读写远程仓库使用的 Git 保存的与其对应的URL。

  1.  
    $ git remote -v
  2.  
    origin https://github .com/junkchen/Documents.git (fetch)
  3.  
    origin https://github .com/junkchen/Documents.git (push)

 

若还想要查看某个远程仓库的更多信息,可使用 git remote show [remote-name] 命令,如查看 origin :

$ git remote show origin

 

添加远程仓库

运行 git remote add < shortname > < url > 添加一个新的远程Git 仓库,同时指定一个你能够轻松引用的简写:

$ git remote add pb https://github.com/paulboone/ticgit

 

如今能够在命令行中使用字符串 pb 来代替整个 URL。若是你想获取 Paul 的仓库中有但你没有的信息,能够运行 git fetch pb:

$ git fetch pb

 

从远程仓库中抓取与拉取

如上面所示,从远程仓库中获取数据,能够执行:

$ git fetch <remote-name>

 

这个命令会访问远程仓库,从中拉取全部你尚未的数据。执行完成后,你将会拥有远程仓库中全部分支的引用,可随时合并或查看。

若你使用 git clone 命令克隆一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。 因此,git fetch origin 会抓取克隆(或上一次抓取)后新推送的全部工做。 必须注意 git fetch 命令会将数据拉取到你的本地仓库,它并不会自动合并或修改你当前的工做。 当准备好时你必须手动将其合并入你的工做。

若是你有一个分支设置为跟踪一个远程分支,可使用 git pull 命令来自动的抓取而后合并远程分支到当前分支。 默认状况下,git clone 命令会自动设置本地 master 分支跟踪克隆的远程仓库的master 分支(或无论是什么名字的默认分支)。运行 git pull 一般会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。

推送到远程仓库

使用 git push [remote-name] [branch-name] 命令能够推送到远程仓库。 当你想要将 master 分支推送到 origin 服务器时(再次说明,克隆时一般会自动帮你设置好那两个名字),那么运行这个命令就能够将你所作的备份到服务器:

$ git push origin master

 

只有当你有所克隆服务器的写入权限,而且以前没有人推送过期,这条命令才能生效。 当你和其余人在同一时间克隆,他们先推送到上游而后你再推送到上游,你的推送就会毫无疑问地被拒绝。 你必须先将他们的工做拉取下来并将其合并进你的工做后才能推送。(可先 pull 再 push )

远程仓库的移除与重命名

若是想要重命名引用的名字能够运行 git remote rename 去修改一个远程仓库的简写名。 例如,想要将 pb 重命名为 paul,能够用 git remote rename 这样作:

  1.  
    $ git remote rename pb paul
  2.  
    $ git remote
  3.  
    origin
  4.  
    paul

 

值得注意的是这一样也会修改你的远程分支名字。 那些过去引用 pb/master 的如今会引用 paul/master。

若是由于一些缘由想要移除一个远程仓库,你已经从服务器上搬走了或再也不想使用某一个特定的镜像了,又或者某一个贡献者再也不贡献了 - 可使用 git remote rm :

  1.  
    $ git remote rm paul
  2.  
    $ git remote
  3.  
    origin
     
    -------------------------------------------------------------------------------------------------------------------
    把远程分支的代码pull到本地分支:git pull <远程主机名> <远程分支名>:<本地分支名>
    如:取回origin主机的xf分支,与本地的xf分支合并,输入命令:
    git pull origin xf:xf
    远程主机名可经过上方的git branch -a或git branch -r查询,看下图:
    PS:push代码前最好先用pull更新本地代码。
     
    八、最后一步:git push <远程主机名> <本地分支名>:<远程分支名>
    PS:注意,分支推送顺序的写法是<来源地>:<目的地>,因此git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。
     
    eg: 
    git push origin xf:xf
    上面命令表示,将本地的xf分支推送到origin主机的xf分支。
     
    若是省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支(一般二者同名),若是该远程分支不存在,则会被新建。
    eg: 
    git push origin test
    上面命令表示,将本地的test分支推送到origin主机的test分支。若是后者不存在,则会被新建。
相关文章
相关标签/搜索