Git 客户端安装使用以及常见问题
一、安装 git 客户端
首先,你可以试着输入 git,看看系统有木有安装 Git。如果没有安装就运行一下
yum install git-core
二、配置用户
因为 Git 是分布式版本控制系统,所以每个机器都必须自报家门:你的名字和 Email 地址。这两条配置很重要,每次 git 提交时都会引用这两条信息,说明是谁提交更新,所以会随更新内容一起被永久纳入历史记录。
git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。而正是由于这些环境变量,决定了 git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:
- /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 —system 选项,读写的就是这个文件。
- ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户(可以是 root 用户,也可以是其他用户,其他用户的目录是在/home下)。若使用 git config 时用 —global 选项,读写的就是这个文件。
- .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 ‘you@example.com’
三、文本编辑器
接下来要设置的事默认使用的文本编辑器。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 实际会采用的是最后一个。
六、几个名词
- 工作区(working directory):工作区就是你电脑能看到的目录,比如说我们的文件夹 learngit 文件夹就是一个工作区。
- 版本库(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 git@github.com: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库加入到你的项目中,可能既要保持你自己的变更,又要延续上游的变更。首先你要把外部的仓库克隆到你的子目录中,你通过gitsubmodule 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 强制运行
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论