文章目录
INSTALL
Mac上安装git
http://sourceforge.net/projects/git-osx-installer/
或者homebrew安装。
Windows上安装Git
https://gitforwindows.org/
下载安装程序,然后按默认选项安装即可。
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
配置
用户信息
#首先在本地创建ssh key
$ ssh-keygen -t rsa -C "379144671@qq.com"
#验证是否成功
$ ssh -T git@github.com
#配置用户名和账号
$ git config --global user.name "view1994"
$ git config --global user.email 379144671@qq.com
如果用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。
如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 --global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。
在以下3个地方会有git配置文件,优先级依次升高:
- /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
- ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
- 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。
比较器
$ git config --global merge.tool vimdiff
Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和 opendiff 等合并工具的输出信息。当然,也可以指定使用自己开发的工具。
查看
要检查已有的配置信息,可以使用git config --list
命令:
有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如 /etc/gitconfig 和 ~/.gitconfig),不过最终 Git 实际采用的是最后一个。
这些配置我们也可以直接打开 ~/.gitconfig 或 /etc/gitconfig 看到。
也可以直接查阅某个环境变量的设定,只要把特定的名字跟在后面即可:
工作流程
新建仓库
git init
$ cd xxx #进到要当作仓库的文件夹中,没有的话就先mkdir一个
$ git init
$ ls -ah #列出当前路径下全部文件名,包括隐藏文件,会看到多了个.git文件夹,所有 Git 需要的数据和资源都存放在这个目录中,说明创建成功了
或者用git init
+WORKROOT来将WORKROOT指定为仓库。
如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪,然后提交:
$ git add *.c #将当前路径下所有c文件加入暂存区,也可以用add . 来加入所有文件
$ git commit -m '初始化项目版本' #提交暂存区的改动,-m后面是log message
克隆仓库
使用 git clone
从现有 Git 仓库中拷贝项目(类似 svn checkout)。
格式:git clone <repo> <directory>
参数:
<repo>
是要克隆的仓库地址,一般上github上去复制;
<directory>
本地目录,是要把这个仓库克隆到的位置,可以不指定,不指定时就放到当前目录下了。
例如,把我的一个仓库克隆到当前路径下的myLeetCode文件夹中:
git clone https://github.com/view1994/LeetCodeExercise myLeetCode
基本操作
git add
用来把文件加到暂存区。
git add test_git
表示把test_git文件加到暂存区。
git status
用来查看当前git的状态,可以看到有没有可以上传的文件和未加到暂存区的文件等。
后面可以加上-s参数,即git status -s
,表示用符号来显示文件状态,不加-s的时候提示的废话比较多:
深红色的??表示这个文件还没加到暂存区,是暂存区跟工作区不一样的地方;
绿色的A表示这个文件已经加到暂存区了,可以commit了;
红色的M表示这个文件被改了,被改的内容没加到暂存区。
AM 状态的意思是,这个文件在将它添加到缓存之后又有改动。改动后要再执行 git add 命令将其添加到缓存中,否则上传的就只有之前的改动了。
git diff
git diff 用来查看执行 git status 结果的详细信息。
git diff 命令显示已写入缓存与已修改但尚未写入缓存的改动的区别。
尚未缓存的改动:
git diff
查看已缓存的改动:git diff --cached
查看已缓存的与未缓存的所有改动:git diff HEAD
显示摘要而非整个 diff:git diff --stat
git commit
git add 命令用来将想要快照的内容写入缓存区, 而执行 git commit 将缓存区内容添加到仓库中。
Git 为每一个提交都记录名字与电子邮箱地址,所以需要先配置好用户名和邮箱地址。
$ git add test_git
$ git commit -m "这里是提交说明"
如果没有设置 -m 选项,Git 会尝试打开一个编辑器以填写提交说明信息。 如果 Git 在你对它的配置中找不到相关信息,默认会打开 vim。所以,还是养成写-m的习惯吧。
另外,如果觉得 git add 提交缓存的流程太过繁琐,Git 也允许用 -a 选项跳过这一步,可以把add和commit两步合二为一。命令格式:git commit -a
例如:
git commit -am '修改 test_git 文件'
git reset HEAD
用于取消已缓存的内容。
git log
git log
用来查看版本信息,开头的一堆数字是版本的ID,常用有如下形式:
$ git log --oneline #在一行内显示一条log,ID只显示开头几位,这样显示的比较好看
$ git log --pretty=oneline #在一行内显示一条log
git reset
查看完版本信息后,可以选择任意一个版本去退回,一般用git reset --hard <id>
来在各版本之间跳转:
$ git log --oneline
$ git reset --hard <id>
git reflog
git reflog?
用来查看完整的log,包括版本退回。
gitHub 工作流程
$ mkdir git-test # 创建测试目录
$ cd git-test/ # 进入测试目录
$ echo "# Git 测试" >> README.md # 创建 README.md 文件并写入内容
$ ls # 查看目录下的文件
README
$ git init # 初始化
$ git add README.md # 添加文件
$ git commit -m "添加 README.md 文件" # 提交并备注信息
[master (root-commit) 0205aab] 添加 README.md 文件
1 file changed, 1 insertion(+)
create mode 100644 README.md
# 提交到 Github
$ git remote add origin git@github.com:view1994/newRepo.git
$ git push -u origin master
建立联系
git bash中,进入要上传的仓库路径,添加远程地址:
$ git remote add origin git@github.com:view1994/yourRepo.git
其中yourRepo是新建的远程仓库名,加完之后进入.git,打开config,这里会多出一个remote "origin"内容,这就是刚才添加的远程地址,也可以直接修改config来配置远程地址。
创建新文件夹,打开,然后执行 git init 以创建新的 git 仓库。
git clone
创建一个本地仓库的克隆版本:
$ git clone /path/to/repository
克隆远端服务器上的仓库,你的命令会是这个样子:
$ git clone username@host:/path/to/repository
你的本地仓库由 git 维护的3个tree组成:
- 第一个是你的 工作目录,它持有实际文件;
- 第二个是 暂存区
Index
,它像个缓存区域,临时保存你的改动;- 最后是
HEAD
,它指向你最后一次提交的结果。
git remote
查看当前已有的远程仓库:$ git remote
加上 -v 参数,就能看到每个别名的实际链接地址$ git remote -v
tanys@prtanys MINGW32 /d/VIEW/13python/LeetCodeExercise (master)
$ git remote
origin
tanys@prtanys MINGW32 /d/VIEW/13python/LeetCodeExercise (master)
$ git remote -v
origin git@github.com:view1994/LeetCodeExercise.git (fetch)
origin git@github.com:view1994/LeetCodeExercise.git (push)
删除远程仓库
git remote rm [别名]
git add
这是git 基本工作流程的第一步:
修改代码后(把它们添加到暂存区),使用如下命令:
git add <filename>
git add *
这个是添加当前目录下的全部文件
git commit
第二步:
实际提交改动:
git commit -m "代码提交信息,多少要写点儿"
现在,修改的代码已经提交到了 HEAD
,但是还没到远端仓库。
git push
第三步:推送改动
修改的代码已经在本地仓库的 HEAD
中了,将这些改动提交到远端仓库:
git push origin master
可以把 master 换成你想要推送的任何分支。
如果还没有克隆现有仓库,并想将本地仓库连接到某个远程服务器,用如下命令添加:
git remote add origin <server>
如此就能够将改动推送到所添加的服务器上去了。
分支
分支是用来将特性开发绝缘开来的。
在创建仓库的时候,master 是默认的分支。实际在其他分支上进行开发,完成后再将它们合并到主分支上。
在现有软件上添加新功能时,可以创建一个叫做"feature_x"的分支,并切换过去:
git checkout -b feature_x
切换回主分支:
git checkout master
再把新建的分支删掉:
git branch -d feature_x
除非将分支推送到远端仓库,不然该分支别人都是看不到的:
git push origin <branch>
git fetch 和 git merge
Git 有两个命令用来提取远程仓库的更新。
1、从远程仓库下载新分支与数据:
git fetch
该命令执行完后需要执行git merge
来合并远程分支到当前所在的分支。
2、从远端仓库提取数据并尝试合并到当前分支:
git merge
假设你配置好了一个远程仓库,并且你想要提取更新的数据,你可以首先执行git fetch [alias]
告诉 Git 去获取它有你没有的数据,然后执行 git merge [alias]/[branch]
将服务器上的更新(例如有人把自己的更新推送到服务器了)合并到你的当前分支。
git pull 更新与合并
要更新你的本地仓库至最新改动,执行:$ git pull
这一步是用来在工作目录中 获取(fetch) 并 合并(merge) 远端的改动。
前提是本地没有改动蛤,如果本地有没有push的改动,会pull失败的,pull失败之后在本地能看到别人上传远端的更新记录,这个时候就只能手动合代码咯~一般先reset一下自己的代码,然后pull远端的更新,然后再改自己的代码,毕竟,每次要更新到远端时要保持自己的版本是最新版本,再合代码上传,SVN上也是这样滴
合并分支
要合并其他分支到你的当前分支(例如 master),执行:
git merge <branch>
在这两种情况下,git 都会尝试去自动合并改动。自动合并并非每次都能成功,可能出现冲突(conflicts)。 这时候就需要修改这些文件来手动合并这些冲突(conflicts)。改完之后,需要将它们标记为合并成功:
git add <filename>
在合并改动之前,你可以使用如下命令预览差异:
git diff <source_branch> <target_branch>
替换本地改动
假如操作失误,可以使用如下命令替换掉本地改动:
git checkout -- <filename>
此命令会使用 HEAD
中的最新内容替换掉工作目录中的文件。
已添加到暂存区的改动(也就是add后的文件)以及新添加的文件都不会受到影响。
如果想丢弃本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将本地主分支指向它:
git fetch origin
git reset --hard origin/master
标签
创建标签就跟平时定义软件发布版本一样的。在 SVN 中也有标签的概念。
创建一个叫做 1.0.0 的标签:
git tag 1.0.0 1b2e1d63ff
1b2e1d63ff 是想要标记的版本 ID 的前 10 位字符。可以使用git log
获取版本 ID,也可以使用少一点的ID 前几位,只要它的指向具有唯一性。