git安装过程:
windows安装
(1)首先安装git
安装好后,打开git bash
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
(2)创建本地版本库
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
通过git init命令把这个目录变成Git可以管理的仓库
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
(3)远程仓库
创建远程仓库learngit.git
创建SSH Key
$ ssh-keygen -t rsa -C "youremail@example.com"
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
陆GitHub,打开“Account settings”,“SSH Keys”页面
点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容
$ git remote add origin git@github.com:michaelliao/learngit.git
上面的michaelliao替换成你自己的GitHub账户名
git add
git commit
$ git push -u origin master
按提示输入yes
1、简单操作
1.1 git add **.txt
git commit -m "**"
git status//查看工作区状态
git reset --hard 3628164//回退
git reset --hard HEAD^//回退
cat **.txt//查看内容
1.2 git diff
git diff
(1)当暂存区中没有文件时,git diff比较的是,工作区中的文件与上次提交到版本库中的文件。
(2)当暂存区中有文件时,git diff则比较的是,当前工作区中的文件与暂存区中的文件
git diff --cached显示索引区与git仓库之间的差异
git diff HEAD 显示工作目录与git仓库之间的差异
git diff HEAD^ 比较上次提交
git diff HEAD~2 比较上2次提交
git difftool 使用图形工具显示文件之间的差异
git diff --stat 列出文件
git diff -- filename 只对比给定的文件
历史提交对比:
$ git diff commit 将所指定的某次提交与当前工作目录进行对比。
$ git diff commit1 commit2 将2次提交的内容进行对比
等价于
$ git diff commit1..commit2 如果省略任意一个commit,默认将使用HEAD代替
commit可以是简写的commit哈希值,也可是是HEAD。其中HEAD代表最后一次提交,HEAD^代表最后一次提交的父提交,HEAD~1>等价于HEAD^, HEAD~2为倒数第二次提交,以此类推。
git diff HEAD -- **.txt//查看工作区和版本库里面最新版本的区别
1.3 git log
git log//查看详细修改记录(commit)
git log --pretty=oneline//查看简约修改记录
git log --graph//分支合并图
git log --graph --pretty=oneline --abbrev-commit
查看分支关系
git log --graph --decorate --oneline --simplify-by-decoration --all
git reflog//命令记录
git config --global alias.st status//起别名status->st
--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用
2、详解add
git add -A, git add . 和git add -u在功能上看似很相近,但还是存在一点差别
git add . :他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。
git add -u :他仅监控已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区。add -u 不会提交新文件(untracked file)。(git add --update的缩写)
git add -A :是上面两个功能的合集(git add --all的缩写)
3、添加远程
git remote add origin git@gitub.com:michaelliao/learngit.git//添加远程库
git push -u origin master//首次推送
git push origin master//推送
git clone https://github.com/wujing1714/gitskills.git //从远程库克隆
git checkout -b dev origin/dev //创建远程origin的dev分支到本地
git push origin dev//推送到远程origin的dev分支
多人协作的工作模式通常是这样:
首先,可以试图用git push origin branch-name推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull更新本地;
如果有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,
则说明本地分支和远程分支的链接关系没有创建,
用命令git branch --set-upstream branch-name origin/branch-name。
4、创建切换分支
git checkout -b dev//创建分支dev并切换
相当于
$git branch dev
$git checkout dev这两条
git branch -d <name>//删除分支
删除分支:$ git branch -d [name] ---- -d选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用-D选项
$ git merge [name] ----将名称为[name]的分支与当前分支合并
$ git push origin [name]创建远程分支(本地分支push到远程)
$ git push origin :[name]删除远程分支
5、删除工作区,已提交暂存区、版本库文件
仅仅删除暂存区里的文件
git rm --cache 文件名
删除暂存区和工作区的文件
git rm -f 文件名
删除错误提交的commit
//仅仅只是撤销已提交的版本库,不会修改暂存区和工作区
git reset --soft 版本库ID
//仅仅只是撤销已提交的版本库和暂存区,不会修改工作区
git reset --mixed 版本库ID
//彻底将工作区、暂存区和版本库记录恢复到指定的版本库
git reset --hard 版本库ID
git checkout -- readme.txt//把readme.txt文件在工作区的修改全部撤销
6、stash操作
git stash//暂存任务
git stash list//查看暂存任务
返回任务的两种方法
(1)git stash apply
git stash drop
(2)git stash pop
若暂存了多个任务
先git stash list查看暂存任务
再恢复指定的stash
git stash apply stash@{0}
7、tag操作
git tag <name>//用于新建一个标签,默认为HEAD,也可以指定一个commit id
git tag -a <tagname> -m "blablabla..."//可以指定标签信息;
git tag -s <tagname> -m "blablabla..."//可以用PGP签名标签
git show <tagname>//查看标签信息:
git tag -d v0.1//删除标签
git push origin v1.0//推送标签到远程
git push origin --tags//一次性推送标签到远程
git tag -d v0.9//标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除
git push origin :refs/tags/v0.9//从远程删除
8、merge
git merge --no-ff -m "merge with no-ff" dev//合并dev分支时,
加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,
能看出来曾经做过合并,默认情况下,Git执行"快进式合并"(fast-farward merge),
而fast forward合并就看不出来曾经做过合并。
9、git忽略已经被提交的文件, 远程的会被删除
git rm --cached logs/xx.log
git add -u
git commit -m "We really don't want Git to track this anymore!"
10、一个git工程除了默认的origin 仓库外,还可以为其添加一个新的远程仓库, 可以随意指定一个名字, 运行
$ git remote add new_repository_name git://github.com/paulboone/ticgit.git
问题描述: 当我们 在github上fork出一个项目后,如果原有的项目更新了,
怎样保持我们fork出来的项目和原有项目保持同步呢,并提交我们的代码呢?
10.1、首先添加你从github上fork的源仓库到本地的git工程:
$ git remote add source_repository_name [url]
10.2、 假设origin仓库和source_repository_name源仓库都有一个分支branch_name,
你在该分支上进行开发,将本地修改commit后,在每次Push前做如下操作,
即可实现和上游source_repository_name仓库同步:
(1)同步源仓库的信息到本地
$ git remote update source_repository_name
或者$ git fetch source_repository_name
(2)将源仓库的信息merge到本地分支:
$ git checkout branch_name
$ git rebase source_repository_name/branch_name
10.3、$ git push 将最新同步的代码和修改,提交到你的origin仓库
10.4、Github上提出Push Request即可,将你的origin仓库的所有修改提交到source_repository_name仓库
GitHub常用的开发协同流程为:将别人的仓库fork成自己的origin仓库 →
git clone origin仓库到本地 → 本地添加fork源仓库 →
工作前先git remote update下fork源保持代码较新 →
coding → push回自己 → github上提出Push Request即可
11、解决冲突
手动解决后,再次使用git add ,git commit,git push
12、rebase使用
本地
git checkout dev
git rebase master
远程
git remote update upstream //或者用git fetch upstream
git rebase upstream/master
若有冲突
git add -u
git rebase --continue
然后
git checkout master
git merge dev