git client - yaokun123/php-wiki GitHub Wiki

git客户端

一、安装git客户端

首先,你可以试着输入git,看看系统有木有安装Git。如果没有安装就运行一下

yum install git-core

二、配置用户

因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。这两条配置很重要,每次 git提交时都会引用这两条信息,说明是谁提交更新,所以会随更新内容一起被永久纳入历史记录。

git提供了一个叫做git config的工具,专门用来配置或读取相应的工作环境变量。而正是由于这些环境变量,决定 了git在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方

1、/etc/gitconfig文件:系统中对所有用户都普遍适用的配置。若使用git config 时用—system选项,读写的
就是这个文件。
2、~/.gitconfig文件:用户目录下的配置文件只适用于该用户(可以是root用户,也可以是其他用户,其他用户
的目录是在/home下)。若使用git config时用—global选项,读写的就是这个文件。
3、.git/config文件:当前项目的git目录中的配置文件,这里的配置仅仅针对当前项目有效。每一个级别的配置
都会覆盖上一层的相同配置,所以.git/config里的配置会覆盖/etc/gitconfig中同名变量。

注意:如果用了 —global参数,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使
用这里配置的用户信息。如果要在某个特定的项目中使用其他名字或者邮箱,只要在新的项目目录中使用
git config去掉—global选项重新配置即可,新的设定保存在当前的项目的.git/config文件里。
git config —global user.name ‘you name’
git config —global user.email ‘[email protected]

三、文本编辑器

接下来要设置的事默认使用的文本编辑器。git需要你输入一些额外的消息的时候,会自动调用一个外部的文本编辑器 给你用。默认会使用操作系统指定的默认编辑器,一般可能是vi或者vim。如果你有其他偏好,比如Emacs的话,你 可以重新设置:

git config —global core.editor emacs

四、差异分析工具

还有一个比较常用的是,在解决冲突的时候使用哪种差异分析工具。比如要改用vimdiff的话:

git config —global merge.tool vimdiff

五、查看配置信息

config 配置有system级别 global(用户级别) 和local(当前仓库)三个 设置先从system-》global-》 local 底层配置会覆盖顶层配置 分别使用--system/global/local 可以定位到配置文件

查看系统config:git config --system --list
查看当前用户(global)配置:git config --global  --list
查看当前仓库配置信息:git config --local  --list

有时候会看到重复的变量名,那就说明它们来自不同的配置文件,不过最终git实际会采用的是最后一个。

六、几个名词

1、工作区(working directory):
工作区就是你电脑能看到的目录,比如说我们的文件夹learngit文件夹就是一个工作区。
2、版本库(Repository):
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里面存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有git为我们自动创建
的第一个分支master,以及指向master的一个指针叫做HEAD。

七、git的基本命令

1.跟踪新文件
使用命令git add开始跟踪一个新文件。
git add 后面可以指明要跟踪的文件后目录路径。如果是目录的话,就说明要递归跟踪该目录下的所有文件。
$git add read.txt
2.检查当前文件状态
要确定哪些文件当前处于什么状态,可以用git status命令。
$git status
3.忽略某些文件
一般我们总会有些文件无须纳入git的管理,也不希望它们总是出现在未跟踪文件列表。通常都是些自动生成的文件,
比如日志文件,或者编译过程中创建的临时文件。我们可以创建一个名为.gitignore的文件,列出要忽略的文件模
式。
4.查看已暂存和未暂存的更新:
此命令比较的是工作目录中当前文件和快照之间的差异,也就是修改之后还没有暂存起来的变化内容若要看已经暂存
起来的文件和上次提交时的快照之间的差异,可以用git diff —cached命令。
$git diff
5.提交更新
现在的暂存区域已经准备妥当可以提交了。在此之前,请一定要确认还有什么修改过的或更新的文件还没有git add
过,否则提交的时候不会记录这些还没暂存起来的变化。所以每次准备提交前,先用git status看一下,是不是都
已经暂存了,然后再运行提交命令git commit
$git commit -m ‘add a file'
6.跳过使用暂存区域
git提供一个跳过使用暂存区域的方式,只要在提交的时候,给git commit 加上-a选项,git就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过git add步骤。
7.移除文件
要从git中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。
如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项-f,以防误删除文件后丢失修改内容。
另外一种情况是,我们想把文件从git仓库中删除(即从暂存区域移除),但仍然希望保留在当前工作目录中。换句话
说,仅是从跟踪清单中删除。比如一些大型日志文件或者一堆.a编译文件,不小心纳入仓库后,要移除跟踪但不删除
文件,以便稍后在.gitignore文件中补上,用—cached选项即可。
$git rm [file_name]
8.查看提交历史
在提交了若干更新之后,又或者克隆了某个项目,想回顾一下,可以使用git log命令查看。
默认不用任何参数的话,git log会按照提交时间列出所有的更新,最近的更新排在最上面。我们常用-p选项展开显
示每次提交的内容差异,用-2则仅显示最近两次更新。—pretty选项,可以指定使用完全不同于默认格式的方式展示
提交历史。比如oneline将每个提交放在一行显示,这个在提交数很大时非常有用。
$git log
回退版本
$git reset —hard [commit_id]
9.查看当前的远程库
要查看当前配置有哪些远程仓库,可以使用git remote命令,它会列出每个远程库的简短名字。在科隆完某个项目
后,至少可以看到一个名为origin的远程库,git默认使用这个名字来标示你所克隆的原始仓库。
$git remote [-v]
10.添加一个远程仓库
要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用。
$git remote add [shortname] [url]
11.从远程仓库抓取数据
此命令会到远程仓库中拉取所有你本地仓库中还没有的数据。运行完成后,你就可以在本地访问该远程仓库中的所有
分支,将其中某个分支合并到本地,或者只是取出某个分支,一探究竟。
⚠️注意:如果是克隆了一个仓库,此命令会自动将远程仓库归于origin名下。所以git fetch origin会抓取从你
上次克隆以来别人上传到此远程仓库中的所有更新。有一点跟重要,需要记住,fetch命令只是将远端的数据拉到本
地仓库,并不自动合并到当前工作分支,只有你确实准备好了,才能手工合并。
如果设置了某个分支用于跟踪某个远端仓库的分支,可以使用git pull命令自动抓取数据下来,然后将远端分支自动
合并到本地仓库中当前分支。默认情况下git clone命令本质上就是自动创建了本地的master分支用于跟踪远程仓
库中的master分支。
git fetch [remote-name|shortname]
12.推送数据到远程仓库
$git push [remote-name|shortname] [branch-name]
克隆操作会自动使用默认的master和origin名字。
13.查看远程仓库信息
$git retmote show [remote-name|shortname]
14.远程仓库的删除和重命名
$git remote rename [remote-name] [new-remote-name]
注意,对远程仓库的重命名,也会使对应的分支名称发生变化,原来的remote-name/master分支现在变成了new-
remote-name/master。
$git remote rm paul
15.打标签
同大多数VCS一样,git也可以对某一时间点上的版本打上标签。人们在发布某个软件版本的时候,经常这么做。
列显已有的标签
$git tag
显示得标签按字母顺序排序,所以标签的先后并不表示重要程度的轻重。
新建标签
git使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。轻量级标签就像是不会变化的
分支,实际上他就是个指向特定提交对象的引用。而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身
的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明。一般都是使用含附注型的标签,以便保留
相关信息。创建一个含附注型的标签非常简单,用-a指定标签名字即可。
$git tag -a [tag-name] -m ‘message'
而-m选项则指定了对应的标签说明,git会将此说明一同保存在标签对象中。如果没有给出该选项,git会启动文本编辑软件供你输入标签说明
后期加注标签
你甚至可以在后期对早先的某次提交加注标签。
$git tag -a [tag-name] 校验和
标签分享
默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。
$git push origin [tagname]
如果要一次推送所有本地标签上去,可以使用—tags选项
$git push origin —tags
16.创建分支
这个命令仅仅是创建一个新的分支,但不会自动切换到这个分支中去。
$git branch [branchName]
17.切换分支
$git checkout [branchName]
18.创建并切换分支
git checkout -b [branchName]
19.合并分支
$git merge [branchName](合并分支之前要切换到master分支上)
20.删除分支
$git branch -d [branchName]
21.查看当前分支
$git branch
22.同步远程仓库的分支到本地
$git checkout -b [branchName] origin/[branchName]

八、取得项目的git仓库

有两种取得git项目仓库的方法。 第一种是在现存的目录下,通过导入所有文件来创建新的git仓库,然后关联远程仓库。 第二种是从已有的GIT仓库克隆出一个新的镜像仓库来。

第一种
$cd your_project
$git init
$git add read.txt
$git commit -m ‘add a file'
$git remote add [shortname] [url](添加一个远程仓库)
$git push [remote-name|shortname] [branch-name](推送数据到远程仓库)
由于远程库是空的,所以第一次推送master分支时,加上-u参数,git不但会把本地的master分支内容推送到远程
的新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或拉取时就可以简化命
令
$git push -u origin master
如果远程仓库不是空仓库的话,则需要进行与本地仓库合并,输入git pull origin master从远程master分支获取内容,然后合并后上传git push origin master


第二种
$git clone [email protected]:yaokun123/git_repository.git
这会在当前的目录下面创建一个名为’git_repository’的目录,其中包含一个.git目录,用于保存下载下来的所
有版本记录,然后从中取出最新版本的文件拷贝。
如果希望在克隆的时候,自定义要新建的目录名称,可以在上面的命令末尾制定新的名字。

九、自动完成

如果你用的是Bash shell,可以试试看git提供的自动完成脚本。下载git的源代码,进入contrib/completion 目录,会看到一个git-completion.bash文件。将此文件复制到你自己的用户主目录中

$cp git-completion.bash ~/.git-completion.bash
并把下面一行内容添加到你的.bashrc文件中
source ~/.git-completion.bash

十、遇到冲突时的分支合并

有时候合并操作并不会如此顺利。如果在不同的分支中,都修改了同一个文件的同一部分,git就无法干净的把两者合到一起(逻辑上说,这种问题只能由人来裁决)。
要看看哪些文件在合并时发生冲突,可以用git status查阅。
任何包含未解决冲突的文件都会以未合并(unmerged)的状态列出。git会在有冲突的文件里加入标准的冲突解决标记,可以通过它们来手工定位并解决这些冲突。

十一、分支的衍合

把一个分支整合到另一个分支的办法有两种:merge和rebase。
rebase:你可以把C3里产生的变化补丁在C4的基础上重新打一遍。在git里,这种操作叫做衍合(rebase)。有了
rebase命令,就可以把在一个分支里提交的改变移到另一个分支里重放一遍。衍合能产生一个更为整洁的提交历史。
注意:一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行衍合操作

十二、储藏

经常有这样的事情发生,当你正在进行项目中的某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令。
‘储藏’可以获取你工作目录的中间状态,也就是你修改过的被追踪的文件和暂存的变更,并将它保存到一个未完结变更的堆栈中,随时可以重新应用。
储藏你的工作
现在你想切换分支,但是你还不想提交你正在进行中的工作,所以你储藏这些变更。为了忘堆栈推送一个新的储藏,只要运行git stash,你的工作目录就干净了。
$git stash
这时,你可以方便地切换到其他分支工作;你的变更都保存在栈上。要查看现有的储藏,你可以使用
$git stash list
个案列中,之前已经进行了两次储藏,所以你可以访问到三个不同的储藏。你可以重新应用你刚刚实施的储藏,所采用的命令就是git stash apply。如果你想应用更早的储藏,你可以通过名字指定它,git stash apply stash@{2}。如果你不指明,git默认使用最近的储藏病尝试应用它。
apply选项只尝试应用储藏的工作,储藏的内容仍然在栈上。要移除它,你可以运行git stash drop,加上你希望移除的储藏的名字。
直接使用git stash pop,恢复的同时也把stash内容删除。

十三、子模块

经常有这样的事情,当你在一个项目上工作时,你需要在其中使用另一个项目。也许它是一个第三方开发的库或者是你独立开发合并在多个项目中使用
的。这个场景下一个常见的问题就产生了,你想将两个项目单独处理但是又需要在其中一个中使用另外一个。
子模块允许你将一个git仓库当作另外一个git仓库的目录。这允许你克隆另外一个仓库到你的项目中并且保持你的提交想对独立。
假设你想把rack库加入到你的项目中,可能既要保持你自己的变更,又要延续上游的变更。首先你要把外部的仓库克隆到你的子目录中,你通过git 
submodule add 将外部项目加为子模块。
$git submodule add git://github.com/chnekirchen/rack.git rack
现在你就在项目里的rack子目录下有了一个Rack项目。你可以进入那个子目录,进行变更,从原始仓库拉取和归并等等。
尽管rack是你的工作目录里的子目录,但git把它视作一个子模块,当你不是在那个目录里时并不记录他的内容。取而代之的是,git将它记录成来自那
个仓库的一个特殊的提交。当你在那个子目录里修改并提交时,子项目会通知那里的HEAD已经发生变更并记录你当前正在工作的那个提交,通过那样的方
法,当其他人克隆此项目,他们可以重新创建一致的环境。
克隆一个带子模块的项目
$git clone git://github.com/schacon/myproject.git
rack目录存在了,但是是空的。你必须运行两个命令:git submodule init来初始化你的本地配置文件,git submodule update来从那个项目拉
取所有数据并检出你上层项目里所有的合适提交

十四解决error: The following untracked working tree files would be overwritten by checkout

通过错误提示可知,是由于一些untracked working tree files引起的问题。所以只要解决了这些untracked的文件就能解决这个问题。

git clean -d -fx

删除 一些 没有 git add 的 文件;

 -n 显示将要删除的文件和目录;

    -x -----删除忽略文件已经对git来说不识别的文件

    -d -----删除未被添加到git的路径中的文件

    -f -----强制运行