1.Git 安装
Git 中文详细安装教程(内有git下载地址)
2.Git 基础配置
安装完git之后可以用以下命令进行基础配置:
配置用户名、用户邮箱
git config –global user.name “yourname”
git config –global user.email “youremail@example.com”让git显示颜色,会让命令输出看起来更醒目
git config –global color.ui true
给某些命令配置别名
git config –global alias.st status
以上命令就是对git的基础配置,但最重要的还是先要给git配置用户名与邮箱,其他的可以以后配置。
–global(前面有两个“-”)是全局配置,针对当前用户,如果去掉,就只会针对当前的仓库。
每个仓库的Git配置文件都放在.git/config文件中。别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中。配置别名也可以直接修改这个文件,如果改错了,可以删掉文件重新通过命令配置。
3.Git 常用命令
在讲命令之前,先讲一讲基础概念:
工作区:就是你创建仓库的目录。
版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区(这里就是你修改了工作区却又未git commit的时候保存修改内容的地方),还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
3.1 创建仓库(在空目录下,而且目录路径尽量不包含中文)
进入cmd界面,来到希望创建仓库的目录下,或者直接到希望创建仓库的目录下右击资源管理器,然后打开git bash界面。之后执行以下指令,执行后会有一个隐藏文件.git出现。
$ mkdir emptyDirectory
$ cd emptyDirectory
$ git init
3.2 状态查看
- 仓库状态查看
在git bash界面输入git status
,就可以看到这时仓库的状态,如文件已修改/创建但未提交。 - 文件状态查看
用下面的指令可以查看readme.txt这个文件的具体情况
$ git diff readme.txt
还可以在将文件readme.txt提交到仓库后,用下面命令可以查看工作区和版本库里面最新版本的区别。
$ git diff HEAD – readme.txt
- 查看提交信息
最后,如果要查看提交日志,可以用下面的指令来显示从最近到最远的提交日志:
$ git log
$ git log –pretty=oneline
提交日志是由
3.3 文件操作
- 添加/更新文件
在emptyDirectory目录下添加空文件readme.txt(touch readme.txt
/ cd .>readme.txt
),然后将文件加入仓库。
$ git add readme.txt
$ git commit -m “这次提交想要表明的信息,如:first commit”
可以添加多次文件后再一次性提交:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m “second commit”
如果对readme.txt进行了修改,只要重新git add和git commit就行了。
- 删除文件
$ git rm file3.txt
$ git commit -m “test – delete file”
3.4 版本操作
Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,往上100个版本则写成HEAD~100。
想要回退版本只要git reset --hard HEAD^
就能将版本回退到上一次提交(commit)之前。
用git log --pretty=oneline
或者git log
可以看到每次commit对应的序号,如果版本回退后后悔了还可以git reset --hard 1049a(commit序号)
,而且commit序号不需要完整,只要能与其他序号区分开就行了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。当然用git reflog
也可以查看你的每一次命令与序号。
3.5 撤销操作
- 撤销修改
如果你修改了readme.txt,然后又不想提交了,想撤销它的修改,可以用下面的命令:
$ git checkout – readme.txt
这时有两种结果:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
git checkout – file命令中的–很重要,没有–,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。
git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区,然后重新git checkout – file。
- 撤销删除
如果你不小心用rm readme.txt将readme.txt删除了,然后又非常后悔,那你可以用下面的命令将误删的文件恢复到最新版本,因为本库里还有,但是那些未提交的修改就丢失了:
$ git checkout – readme.txt
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。当然如果是用git rm来删除版本库以及工作区的文件的话,那就无法用git chekcout – file来挽救了。
4.远程仓库
4.1 GitHub账号创建与SSH配置
先在GitHub上面创建一个账号,用于存放你的远程仓库,然后在创建本地仓库。由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:
- 第1步:创建SSH Key。在用户主目录(如:C:\Users\Administrator)下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C “youremail@example.com”
一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
- 第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。点“Add Key”,你就应该看到已经添加的Key。为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
4.2 GitHub创建远程仓库
如果你已经有一个本地仓库了,然后你想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作。
首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库。
在Repository name填入本地仓库文件夹名(如learngit),其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库。然后:
$ git remote add origin https://github.com/accountname/repositoryname
添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
下一步,就可以把本地库的所有内容推送到远程库上:
$ git push -u origin master
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令:git push origin master
。
当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告,因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了。这个警告只会出现一次,后面的操作就不会有任何警告了。
注意
如果新建的远程仓库不是空的,如有READMD.md,而本地仓库也不是空的,那么要将远程仓库与本地仓库同步,必须先将远程仓库的内容拉下来,然后同步到本地,然后再推送到远程仓库:
$ git pull origin master
$ git push -u origin master
4.3 将GitHub远程仓库同步到本地
假设你有一个远程仓库LearnGit,你想将它同步到本地,那么先到你想创建仓库的目录,如:D:\test\,然后用命令git clone克隆一个本地库:
$ git clone https://github.com/accountname/LearnGit
这个时候LearnGit的内容就同步到本地仓库D:\test\LearnGit里面了,如果有多个人协作开发,那么每个人各自从远程克隆一份就可以了。
4.4 远程仓库管理
查看远程库的信息
$ git remote
显示更详细的信息
$ git remote -v
推送本地仓库内容
- 将本地分支内容推送到远程分支:
git push origin localBranchName:remoteBranchName
,如果是将本地的现在所在分支同步到默认的远程以及默认的远程分支master上,则只要git push
就行了。 - 新建本地分之后,要指定本地分支与远程分支的链接:
git branch --set-upstream-to=origin/remoteBranchName localBranchName
。 - 将本地的所有分支都推送到远程主机:
git push all origin
。 - 强制将本地内容推送到远程:
git push force origin
- 将本地分支内容推送到远程分支:
- 拉取远程仓库内容
$ git pull
4.5 两个远程仓库
git本身是分布式版本控制系统,可以同步到另外一个远程库,当然也可以同步到另外两个远程库。使用多个远程库时,我们要注意,git给远程库起的默认名称是origin,如果有多个远程库,我们需要用不同的名称来标识不同的远程库。
比如:
先关联GitHub的远程库:git remote add github https://github.com/accountname/learngit.git
然后关联码云的远程库:git remote add gitee https://gitee.com/accountname/learngit
如果要推送到GitHub,使用命令:git push github master
如果要推送到码云,使用命令:git push gitee master
5. 分支管理
创建分支
$ git branch branchName
切换分支
$ git checkout branchName
创建并切换分支
$ git checkout -b branchName
列出分支和显示所在分支
$ git branch
合并分支到master主分支里面
$ git merge branchName
如果上面的分支是master主分支的改进,即分出上面的分支后,master不做任何改进,则Git会执行“快速合并”,然后不会有任何的冲突。但是如果分支与master以及走上了两条路,而不是分支是master的改进版或者master是分支的改进版,那么再次用git merge,则可能有冲突存在,必须手动解决冲突后再合并。
查看分支合并图
$ git log –graph
$ git log –graph –pretty=oneline –abbrev-commit将远程分支与本地分支同步
$ git push origin localBranchName:remoteBranchName
删除分支
$ git branch -d branchName
删除远程分支
这里是先删除了本地分支,然后删除同名的远程分支。$ git branch -d localbranchName
$ git push origin :remotebranchName强制删除分支
$ git branch -D branchName
6. 标签管理
Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。
在本分支上创建标签
$ git tag tagName
在本分支上查看标签
$ git tag
在本分支上对某个历史上的commit创建标签
$ git tag tagName commitId
查看标签信息
$ git show tagName
创建带有说明的标签,用-a指定标签名,-m指定说明文字
$ git tag -a tagName “the information you want to show”
删除标签
$ git tag -d tagName
推送某个标签
$ git push origin tagName
推送所有标签
$ git push –tags
删除远程标签
先删除本地标签,然后删除远程标签$ git tag -d tagName
$ git push origin :refs/tags/tagName
7. .gitignore简单了解
在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore。
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
- 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。例子:
# Windows: 在Windows下进行Python开发,忽略Windows自动生成的垃圾文件 Thumbs.db ehthumbs.db Desktop.ini # 继续忽略Python编译产生的.pyc、.pyo、dist等文件或目录 *.py[cod] *.so *.egg *.egg-info dist build # 加上你自己定义的文件 db.ini deploy_key_rsa
最后一步就是把.gitignore也提交到Git,就完成了!当然检验.gitignore的标准是git status命令是不是说working directory clean。
如果你确实想添加某个文件,可以用-f强制添加到Git:git add -f App.class
或者你发现,可能是.gitignore写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore命令检查:git check-ignore -v App.class
8. 结语
以上就是我对git的理解和认识,如果有什么错漏的地方,请在下方留言。