Git 学习小结及命令汇总

安装:

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为例)

git常用命令

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 --》本地会创建一个新的分支

pull和fetch的等价

^和~后不跟数字都是默认父部,跟数字,就从当前开始到数字的那个父部

(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/

git命令

推荐阅读更多精彩内容