Git简介
安装Git
在Linux上安装Git
xxxxxxxxxx
31//Debian 和 Ubuntu Linux.
2sudo apt-get install git
3sudo apt-get install git-core //老版的
在Mac OS X上安装Git
xxxxxxxxxx
31两种方法
2方法一:安装homebrew,然后通过homebrew安装Git,参考文档http://brew.sh/。
3方法二:安装Xcode,运行Xcode,选择菜单"Xcode"->"Preferences",在弹出窗口中找到"Downloads",选择"Command Line Tools",点"Install"就可以完成安装了。
在Windows上安装Git
直接从官网下载安装。
安装完成后,在开始菜单里找到"Git"->"Git Bash",单击打开命令行窗口。
最后,设置名字和邮箱地址
xxxxxxxxxx
21$ git config --global user.name "Your Name"
2$ git config --global user.email "email@example.com"
创建版本
初始化一个Git仓库,用 git init 命令。
xxxxxxxxxx
11$ git init
添加文件到Git仓库,分两步:
xxxxxxxxxx
21$ git add filename // 添加文件到暂存区,可多次添加多个文件
2$ git commit -m "message" //commit,完成
时光机穿梭
xxxxxxxxxx
21$ git status // 查看当前仓库的状态(哪些文件进行过修改)
2$ git diff // 查看文件修改的内容,具体见最下方
版本回退
git log:查看从最近到最远的提交日志。
HEAD 表示当前版本,HEAD^ 表示上一个版本,上上一个版本就是 HEAD^^,上100个版本也可以表示成 HEAD~100。
git reset:回到以前的一个版本
xxxxxxxxxx
21$ git reset --hard HEAD^ //回到上一个版本
2$ git reset --hard commit-id //回到commit-id的版本
当你回到过去N-2的版本时,N-1到HEAD之间的版本,用 git log 都看不到了,此时可以用 git reflog,用于查看你的每一次命令。
xxxxxxxxxx
51$ git reflog //下面的为每次操作的命令。
2e475afc HEAD@{1}: reset: moving to HEAD^
31094adb (HEAD -> master) HEAD@{2}: commit: append GPL
4e475afc HEAD@{3}: commit: add distributed
5eaadf4e HEAD@{4}: commit (initial): wrote a readme file
工作区和暂存区
Git分为工作区和暂存区
工作区:电脑里能看到的目录,我们修改的文件就是工作区的。
暂存区:工作区有一个隐藏目录 .git, 这个不算工作区,叫做Git的版本库。
在版本库里,有一个称为 stage(或者叫index) 的暂存区。
对于添加文件的两个步骤:
第一步 git add:实际上就是把文件修改添加到暂存区。
第二步 git commit:实际上就是把暂存区的所有内容提交到当前分支(工作区)。
管理修改
git commit:只会把当前暂存区的修改提交。所以
撤销修改
git checkout -- filename:
把filename文件在工作区的修改全部撤销,这里有两种情况
总之,就是让这个文件回到最近一次 git commit 或 git add 时的状态。
xxxxxxxxxx
11$ git checkout -- filename
git reset:
既可以回退版本,也可以把暂存区的修改回退到工作区。但我们用HEAD时表示最新的版本。
xxxxxxxxxx
11$ git reset HEAD filename //unstage,把暂存区的修改回退到工作区
三种场景
删除文件
xxxxxxxxxx
31$ git rm filename
2$ git commit -m "delete file" //删除文件
3$ git checkout -- filename //还原文件
远程仓库
只有把本地已安装Git的电脑的 SSH Key 添加到 Github 中,你才能 Push 代码到 Github上。
第一步:创建 SSH Key 。在用户主目录下,看看有没有 .ssh 目录,如果有,再看这个目录下有没有 id_rsa 和 id_rsa.pub 这2个文件,可直接跳到下一步。如果没有,打开 Git Bash , 创建 SSH Key :
xxxxxxxxxx
11$ ssh-keygen -t rsa -C "youremail@example.com"
第二步:把 is_rsa.pub 添加到 Github 上。登录 Github ,打开 "Account settings",在"SSH Keys"页面,点"Add SSH Key",填入数据后点确定。
添加远程库
在 Github 上创建新的仓库。
在本地关联远程仓库(先本地,再远程)
xxxxxxxxxx
21// git remote add origin git@server-name:path/repo-name.git
2$ git remote add origin git@github.com:jian2333/For-Front-end.git
推送到远程仓库
xxxxxxxxxx
11$ git push -u origin master
从远程库克隆(先远程,再本地)
在 Github 上创建新的仓库。
clone到本地。
xxxxxxxxxx
21// $ git clone git@server-name:path/repo-name.git
2$git clone git@github.com:jian2333/For-Front-end.git
分支管理
创建与合并分支 (merge后不需要add和commit)
xxxxxxxxxx
61$ git branch //查看当前分支
2$ git branch <name> //创建分支
3$ git checkout <name> //切换分支
4$ git checkout -b <name> //创建并切换到分支
5$ git merge <name> //合并某分支到当前分支
6$ git branch -d <name> //删除分支
解决冲突
xxxxxxxxxx
11$ git log --graph //查看分支合并图
分支管理策略
Fast forward 模式:Git合并时默认的模式,该模式下删除分支后,会丢掉分支信息。
禁用Fast forward模式:在merge时会生成一个新的commit,然后就可以从分支历史上看出分支信息。用 --no-ff 表示。
xxxxxxxxxx
21$ git merge --no-ff -m "message" <name> //因为会生成新的commit,所以需要-m添加描述
2$ git log //查看信息
Bug分支
xxxxxxxxxx
211$ git add <name> //只有add后的文件可以stash
2$ git stash //"储藏"工作现场
3-----------
4$ git checkout master //切换到master分支
5$ git checkout -b issue-101 //创建issue-101 Bug分支
6--修改bug
7$ git add <name>
8$ git commit -m "fix bug 101"
9$ git checkout master //切换回master分支
10$ git merge --no-ff -m "merge bug fix 101" issue-101 //merge Bug分支到master分支
11$ git branch -d issue-101 //删除Bug分支
12-----------
13$ git stash list //查看工作现场
14--方法1
15$ git stash apply //恢复工作现场
16$ git stash drop //删除stash内容
17--方法2
18$ git stash pop //恢复工作现场并删除stash
19--补充,可以stash多次,然后用git stash list查看,再恢复指定的stash
20$ git stash list
21$ git stash appy stash@{0}
Feature分支
xxxxxxxxxx
11$ git branch -D <name> //大写D强行删除分支,小写d普通删除(未merge时会报错)
多人协作
xxxxxxxxxx
41$ git remote -v //查看远程仓库信息
2$ git push origin master //把本地仓库的master分支推送到远程仓库的origin(也就是master)分支
3$ git checkout -b branch-name origin/branch-name //在本地创建和远程分支对应的分支,名称最好一致
4$ git branch --set-upstream branch-name origin/branch-name //建立本地分支和远程分支的关联
Rebase
变基
把分叉的提交历史"整理"成一条直线,看上去更美观。把本地的提交"挪动"了位置,移到了分叉线的最后一端(有可能会导致冲突)。可参考此链接。
xxxxxxxxxx
11$ git rebase //变基
标签管理
创建标签
xxxxxxxxxx
51$ git tag tagName //打标签
2$ git tag tagName commit-id //给commit-id打标签
3$ git tag -a tagName -m "message" commit-id //打带说明的标签,可不带commit-id
4$ git tag //查看所有标签
5$ git show tagName //查看标签信息
操作标签
xxxxxxxxxx
61$ git tag -d tagName //删除标签(本地)
2$ git push origin tagName //推送某个标签到远程
3$ git push origin --tags //一次性推送全部未推送到远程的本地标签
4//删除远程标签:先从本地删除,再删除远程标签
5$ git tag -d tagName
6$ git push origin :refs/tags/tagName //删除远程标签
自定义Git
忽略特殊文件
把要忽略的文件信息添加到工作区下的 .gitignore 文件中;
把 .gitignore 文件也提交到 Git 。
其他属性
强制添加文件
xxxxxxxxxx
11$ git add -f filename
检测哪条 .gitignore 规则忽略了文件
xxxxxxxxxx
21$ git check-ignore -v filename
2.gitignore:3:*.class filename //第三行忽略了该文件
配置别名
配置别名
xxxxxxxxxx
31$ git config --global --list //显示用户配置信息,如果要看当前仓库的,把global改成local就好
2//global配置:放在主目录 C:\Users\计算机名字\.gitconfig中
3//仓库配置:放在仓库的.git/config中
xxxxxxxxxx
21$ git config --global alias.xx operation //把operation配置成别名xx (--global可不写)
2$ git config --global alias.st status
xxxxxxxxxx
41$ git config --global alias.xx 'yyyy' //把字符串yyyy配置成xx
2//example
3$ git config --global alias.last 'log -1'
4$ git last //等于 $ git log -1,查看最近一次的提交
比较工作区和暂存区(不带参数)
xxxxxxxxxx
11git diff filename
比较暂存区和最新本地版本库(本地库中最近一次commit的内容)
xxxxxxxxxx
11git diff --cached filename
比较工作区和最新本地版本库(本地库中最近一次commit的内容)
xxxxxxxxxx
11git diff HEAD filename
比较暂存区和指定commit-id的差异
xxxxxxxxxx
11git diff --cached commit-id filename
比较工作区和指定commit-id的差异
xxxxxxxxxx
11git diff commit-id filename
比较两个commit-id之间的差异
xxxxxxxxxx
11git diff commit-id commit-id
使用git diff打补丁
git diff > patchName, patchName的命名是随意的,不加参数将本仓库 工作区 的修改生成一个patch,供他人使用。使用时在对应目录下使用 git apply patchName 即可。
xxxxxxxxxx
71git diff --cached > patchName, //将暂存区与最新版本库的差异生成补丁
2git diff --HEAD > patchName, //将工作区与最新版本库的差异生成补丁
3git diff filename > patchName, //将单个文件做成一个单独的补丁
4
5扩展:
6git apply patchName 应用补丁。应用补丁之前我们可以先检验一下补丁能否使用,git apply --checkout patchName 如果没有任何输出,那么表示可以顺利接受这个补丁。
7另外可以使用git apply --reject patchName将能打的补丁先打上,有冲突的会生成.rej文件,之后可以找到这些文件手动打补丁。