安装:
windows安装git-- msysgit是windows版的git,下载单独的.exe按照默认选项安装即可 在开始菜单找git-->git bash,会跳出命令行窗口,表示安装成功。输入命令git config --global user.name“你的名字” gitconfig --global user.email“你的邮箱”进行设置
创建版本库(repository):
mkdir 要创建的目录名
cd 要创建的目录名
pwd -->这个命令是显示当前目录的
git init -->把目录变成git可管理的仓库,此时看到路径有.git,若没有,可能默认隐藏了,通过ls -ah命令可以看到
添加文件:
git add文件名-->添加文件,回车后窗口并没有给什么反应
git commit -m“本次说明”-->把文件提交到仓库,-m后面输入的是本次提交的说明
另外说明:为什么需要add和commit两步呢?因为commit可以一次提交多个文件
例如:gitadd file1.txt
git add file2.txt file.txt
git commit -m“add 3 file.”
时光机穿梭:
git status -->若更改文件内容,可以通过这个命令查看当前状态,是否被修改了,修改后是否提交
git diff文件名-->可以查看根据命令输出看到哪里做了修改 修改后提交的步骤依然是add commit,在commit之前运行status看一下当前仓库状态
git status -->可以看到要提交的包括刚刚修改的文件,然后commit一下,继续status
git status -->会告诉我们没有需要提交的修改,工作目录是干净的(working directory clean)
git log -->查看提交的历史记录,从最近到最远的方式显示
git log --pretty=oneline -->看到的一长串是commit
id(版本号),是SHA1计算出来的用十六进制表示的数字
时光机:
git reset --hard HEAD^ -->回退到上一个版本
cat文件名-->查看当前版本的内容,看一下是不是我们要回退的这个版本,此时log已经看不到最新那个版本记录
git reset --hard最新版本的前几位commit id -->回到最新版本,如果找的多个版本号,cat一下看看内容 不要忘记git commit
git reflog -->可以查看每一次命令的commit id
工作区(working directory)和暂存区(stage):
add是把工作区文件添加进暂存区,commit是从暂存区到分支上(版本库包括暂存区和分支),必须先add到暂存区,才能commit到分支上
撤销修改:
git checkout --文件名-->在工作区的修改全部撤销,一是修改后还没有add到暂存区,就回到和版本库一样的状态,就是回到最近一次commit的状态;一是已经add暂存区,又做了修改,是回到add暂存区的状态,就是最近一次add的状态。
git reset HEAD文件名-->把暂存区的修改撤销(unstage),重新回到工作区,checkout--文件名丢弃工作区的修改
gitreset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当用HEAD时,表示最新版本。
删除文件:
rm文件名-->在工作区删除一个已经提交了的文件,现在是版本库和工作区不一致,status可以看到哪些被删了:
一是确定是要删掉这个文件,
git rm
git commit-->通过这两个命令,文件就从版本库中删除了
一是删错了的情况,由于此时版本库里还有这个文件
git checkout --文件名-->现在就是回到最近的版本库状态了
远程仓库:(用github为例)
1,首先需要SSH KEY(在用户主目录下.ssh文件夹下有id_ras(私钥)和id_ras.pub(公钥)),没有的话,打开Git Bash创建ssh-keygen -t rsa -C“你的邮箱”,然后一路回车
2,登录github,打开account setting,ssh keys页面,点击add ssh key,填上任意title,在key里粘贴id_ras.pub文件的内容,然后点击add key。(需要ssh是因为github需要识别推送的消息是否是你推送的)在github上创建仓库,Create a new repo-->在repository name填写仓库名,其他地方默认,create repository,添加成功在新的界面可以看到github给的信息:可以从这个仓库克隆新的仓库,也可以与已有的本地仓库进行关联,把本地仓库的内容push到github仓库。
我们在本地仓库运行如下命令:
git remote add origin git@github.com:github账户名/仓库名.git
--> git对远程库默认的叫法--origin
下一步把本地内容推送到远程:
git push -u origin master-->git push是把当前分支master推送到远程。由于当前远程是空的,第一次推送时加上了-u的参数,git会把本地master和远程master关联起来,后续的推送和拉取就可以简化命令。
git push origin master-->后续就可以通过这个命令从本地进行提交
git push origin HEAD: 远程分支名 -->本地分支名和远程分支名不同的情况下用的命令(你必须在要push的本地分支上)
SSH警告:
第一次使用clone或者push命令连接github时会有警告,
这是因为SSH在第一次验证github服务器的key时,需要确认gtithub的key指纹信息是否为来自github服务器,输入yes即可,然后github反馈给你一个把key添加到本机的信任列表里了的警告,继续yes(在输入之前可以对照github的RAS key的指纹信息是否与SSH连接给出的一致)。
从远程克隆仓库:在github创建一个新的仓库,需要勾选Initialize this repository with a README,这样github会自动创建一个README.md文件。
git clone git@github.com:github账号名/工程名.git-->把仓库克隆到本地
cd仓库名-->把git库的地址切换成自己的
ls -->查看本地存在的文件。(git支持多种协议,包括https(速度慢,每次推送都必须输入口令),ssh)
分支管理:
创建与合并分支--》HEAD指向master(当前分支),master指向提交,
git checkout -b分支名-->创建一个新的分支,-b(branch)表示创建并切换,相当于两条命令,
git branch -->会列出所有分支进行查看,在当前分支前加*。
git checkout master-->回到master分支上
git merge要合并分支名-->用于合并指定分支到当前分支
git branch -d分支名-->删除分支
git branch -f指定分支名要移动到的分支--》把指定的分支名移动到要移动的分支去
git reset local^/ git reset HEAD~1--》都是撤回本地分支local到它的父部
git revert HEAD --》撤回远程分支最近提交的信息重新生成这个分支
git cherry-pick <commit1><commit2><...>--》如果你想将一些提交复制到你当前HEAD位置下,这是很直接的推进方式
git rebase -i HEAD~4 --》是指当前分支位置并包含当前位置往父部共4个位置进行一个界面化交互的操作
git commit --amend --》提交修改,在当前分支重新生成新的分支,弃用当前的
git describr -->用来显示里当前分支最近的tag锚点,可以被commit的位置,没有指定的话代表当前位置输出信息:离最近的tag_这个tag离有多少commit_g当前id的前7位(v1_2_g3234rt5
git bisect一个找寻有bug的commit命令
git fetch从远端获取本地仓库未包含的提交数据,即将本地对远端的映射做了同步更新
git pull == git fetch;git merge在一起的效果
git pull --rebase是fetch和rebase的合用效果
git fakeTeamwork默认行为是在远端master做一个提交
追踪远端的两种方法:
1,git checkout -b分支名origin/master --》创建一个跟踪origin/master的新分支(不是master了)
2,git branch -u origin/master分支名
git push :git push origin master--》切到master分支,抓取所有的提交推送到远端的master分支,基本上用于同步两仓库(在分支上push后没有参数命令是没有效果的)
git push origin::git push origin foo^:master--》foo^指foo分支的父部,表示推送foo分支父部与远端master同步,如果远端的master是branch分支,实际是不存在的,git会在远端为你创建。
git fetch origin foo(分支名)--》在本地foo分支进行远端同步
git fetch origin ::git fetch origin foo~1:bar --》表示本地bar分支同步到远端foo分支的父部;和push相似,但是方向相反,push是推送,fetch是下载
另外有两种不需要的情况,这是通过空参数实现的。
1,git push origin :foo -->远端会删除foo这个分支
2,git fetch origin :foo --》本地会创建一个新的分支
^和~后不跟数字都是默认父部,跟数字,就从当前开始到数字的那个父部
(gitbranch bugWork HEAD~^2~创建分支bugWork同时移动到指定位置)
解决冲突,两个分支同时更改了文件并都没有更新提交后合并就会产生冲突,这是我们打开文件会看到git标记的冲突的地方,进行修改后,把冲突标记更改为已解决,然后在add提交合并。
git log --graph --pretty=oneline --abbrev-commit-->这个命令可以看到分支合并的情况
此时可以branch -d分支了。
分支管理:通常合并分支,如果可能,git会用fast forward模式,但是这种模式下删除分支,会丢掉分支信息。如果禁用fast forward模式,git会在merge时生成新的commit,就可以从历史看出分支信息
一个分支对文件进行更改并提交,但是合并时我们用了这个命令
git merge --no-ff -m "描述"要合并来的分支名--> --no-ff表示禁用fast forward
此时对分支进行删除后
git log --graph --pretty=oneline --abbrev-commit
-->此时是可以看到分支的信息的
bug分支每个bug都可以通过一个新的临时分支来修复,修复后合并分支,返回把临时分支删除。
git stash -->当前分支的任务进行到一半还不能提交,可以用此命令把当前工作现场“储藏”,等后续恢复现场后继续工作。此时可以在其他分支上创建临时分支进行bug修复。修复完成后,提交合并,删除临时分支。
此时stash的那个分支,需要用到新的命令了
git stash list -->可以查看“储藏”的分支,现在需要恢复一下,有两种方法
1,git stash apply需要配合git stash drop来进行删除stash“储藏”的信息内容
2,git stash pop恢复的同时把stash内容也删除
如果多次stash时,恢复时先git stash list查看,用git stash apply stash@{第几个(从0开始计数)}feature分支开发一个新feature最好新建一个分支,如果要丢弃一个没合并过的分支,使用git branch -D分支
多人协作克隆时git自动把本地master和远程master对应起来,远程仓库默认名称origin
git remote -->查看远程仓库信息
git remote -v -->显示更详细的信息
git push origin master -->推送master分支
多人协作的通常模式:
1,首先,可以试图git push
origin分支名推送自己的修改
2,推送失败,则因为远程分支比你的本地更新,需要先git pull更新合并本地代码
3,如果合并有冲突,解决冲突并在本地提交
4,没有冲突或者已经解决掉后,用git
push origin分支名推送就可以成功了
如果git pull提示“no tracking information”,说明本地分支与远程分支没有创建链接,用命令git branch --set-upstream分支名origin/分支名创建链接(在本地创建和远程分支对应的分支,git checkout -b分支名origin/分支名,名称最好一致),如果有冲突要先处理冲突
标签管理:
标签和HEAD很像,但是不可以移动,是版本库的一个快照,让人更容易记住,更容易找的那个版本,标签只存在本地,不会自动推送到远程。
git tag标签信息-->打标签,默认为HEAD,也可以指定一个commit id。
git tag -->查看所有标签信息,标签信息不是按照时间顺序,是按照字母顺序的
git log --pretty=oneline --abbrev-commit -->找的历史忘记需要打标签但是忘记打标签的commit id。
git tag标签信息commit id -->对某个commit id打标签
git show标签信息-->查看这个标签对应的版本信息,包括PGP签名信息
git tag -a标签信息-m“标签说明”commit id --> -a指定标签名,-m指定说明文字
git tag -s标签信息-m“标签说明”commit id -->可以通过-s用私钥签名一个标签
签名采用PGP签名,所以要先安装gpg(GnuPG),如果没有或者没有gpg密钥对。会报错,此时需要GnuPG文档配置key。
git tag -d标签信息-->如果标签打错了,可以通过这个命令删除
git push origin标签信息-->推送某个标签信息到远程
git push origin --tags -->一次性推送全部未推送到远程的本地标签
git push origin :refs/tags/标签信息-->删除一个远程的标签,先删除本地标签后,继续这个命令,可以登录github查看是否已经删除
在github上如果你要修复别人的项目,点击Fork,这是把这个项目克隆到你github的账号下,然后继续克隆到本地仓库电脑上,这时你就可以干活了,完毕后推送到自己的github,如果要推送到别人的项目,你可以pull request,至于接不接受就看别人的心情而定了。
另外,git config --global color.ui true -->使git适当的显示不同的颜色
忽略特殊文件:关于.gitignore文件,github已经准备了各种配置文件,https://github.com/github/gitignore所有配置文件可以直接在线浏览,当然.gitignore文件是需要放到版本库的,并且可以对.gitignore做版本管理
忽略的原则:
1,忽略操作系统自动生成的文件,比如缩略图
2,忽略编译生成的中间文件、可执行文件等,也就是说如果一个文件是通过另一个文件自动生成的,那这个自动生成的文件就不用放进版本库,比如.class
3,忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件
你要添加一个文件到git,发现添加不了,有一下两个解决方法
git add -f文件名-->有可能是被.gitignore忽略了,可以用-f强制添加
git check-ignore -v文件名-->也有可能是.gitignore写的有问题,需要找出写错的这个规则,可以用这个命令检查
配置别名:这些命令单词这么多真心不好记又容易写错,所以这时我们可以为这些命令换一个简单的别名
git config --global alias.别名(st)命令(status)-->例如给status的别名是st,--golbal是全部参数,所以配置好就可以在这台电脑的所以git仓库下都有用,如果不加只对当前仓库有效
git config --global alias. unstage 'reset HEAD'-->撤销修改的别名,git reset HEAD文件名--> git unstage文件名
git config --global alias. last 'log -1' -->显示最后一次提交的信息的别名配置
git config--global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset-%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'--abbrev-commit" -->这个配置出来的效果绚丽,是studio内的version control内的log的信息。
配置文件:首先配置文件是存放在.git/config文件中的。
cat .git/config -->出来的信息中[alias]的信息里是别名配置信息,要删除别名,直接把对应的行删掉即可
cat .gitconfig -->里面是[alias][user]的信息,配置别名可以直接修改这个文件,配置错了,可以删掉文件重新通过命令配置
搭建git服务器:
需要一台Linux的机器(推荐使用Ubuntu/Debian,这样可以几条apt命令就可以安装完成)
假设你已经有sudo权限的用户账号
1,sudo apt-get install git --》安装git
2,sudo adduser git --》创建git用户,用来运行git服务
3,创建证书登录:收集所有要登录的用户公钥(id_ras.pub文件),把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
4,sudo git init --baresample.git --》初始化git仓库,假设是/srv/sample.git,在/srv目录下输入这行命令,git会创建一个裸仓库,裸仓库是没有工作区的,因为服务器上的git仓库纯粹是为了共享,所以不让用户登录到服务器上去改工作区,并且服务器上的git仓库通常是以.git结尾,sudo chown-R git:git sample.git --》把owner改为git
5,禁用shell登录:安全考虑,第二步创建的git用户不允许登录shell,可以通过编辑/etc/passwd文件完成。git:x:1001:1001:,,,:/home/git:/bin/bash-->改为:git :x:1001:1001:,,,:/home/git:/usr/bin/git-shell,这样git用户可以正常通过ssh使用git,但是不能登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出
6,git clone git@server:/srv/sample.git --》通过命令克隆远程仓库,在各自电脑上运行当团队人数很多时,公钥就不能放在服务器的authorized_keys文件里这么玩了,此时用Ditosis来管理公钥。
像svn那样控制权限,用Gitolite
国外友人制作的git
cheat sheet:https://pan.baidu.com/s/1kU5OCOB#list/path=%2F(Git Cheat Sheet)
git官方网站:http://git-scm.com
本次总结来源于廖雪峰博客,网址:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
另外附赠一份练习git的小游戏:http://learngitbranching.js.org/