什么是Git?
Git是一种分布式代码版本管理系统,使用Git,可以很方便地进行代码版本的管理
在编写代码的过程中,可以很方便地把代码进行上传或者下载,代码更新后,再上传到git
使用git,可以很方便地查看代码的修改历史
可以在 linux ,Windows ,mac 上使用 git
关于 Git 的教程,可以参考以下文章
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
windows 下,可以使用 msysGit,可以从以下网址下载: http://msysgit.github.io/
ubuntu 下,可以使用 sudo apt-get install git 来下载最新版本的 git 工具
第一次使用 git 的时候,要执行以下两个命令:
git config --global user.name "wenjs"
git config --global user.email "[email protected]"
在linux ubuntu 学习如何使用 git
1.首先,创建一个目录来进行 git 练习工作,执行如下命令:
mkdir -p /opt/git_test
chmod 777 /opt/git_test
cd /opt/git_test
2.创建好 git_test 目录后,在该目录里执行 git init ,表示对该目录进行初始化,
执行完后,该目录就是本地的一个空的 git 仓库,该目录里面有一个隐藏的文件夹 .git
该文件夹包含本地仓库的一些信息,不要试图更改该目录下的文件,否则会破坏本地仓库
3.在 git_test 目录下,创建一个 hello.c 文件夹,编写代码,然后保存,准备上传到 git 测试用
4.编辑完文件后,就可以使用以下命令,把文件上传到 git 仓库了
git add hello.c 表示把 hello.c 添加到本地的 git 仓库,可反复多次使用
git commit -m "this is a test hello.c file" 表示使用 git commit 命令把文件提交到 git 仓库,该命令的 -m 参数表示后面的是文件的说明,强烈建议加上文件说明
使用 git add 命令,可以添加多个文件,而使用 git commit 命令,是一次提交到 git 仓库,意思就是添加多个文件,一次提交
5.假如对 hello.c 文件进行了修改,但还没有提交到 git 仓库,可以使用如下命令查看文件状态
git status 该命令表示可以查看当前的文件状态,查看文件是否已经被修改过
git diff 该命令表示可以查看文件被修改的内容
6.修改完成后的文件,同样可以使用 git add 和 git commit 两条命令来进行添加和提交
7.git 最大的好处就是,可以随时使用命令查看版本的历史,使用如下命令:
git log 该命令表示可以从近到远查看提交的日志记录
如果嫌该命令输出的信息太多,可以使用 git log --pretty=oneline
[email protected]:/opt/git_test# git log --pretty=oneline
f7f74f3d08f42872c85e71bc23057da0e3b275c2 this is a update hello.c file wenjs
86a76e63fb5aa8cbba4a3d2fe35b75ff081efa8f this is a update hello.c file
50b070643f12ee130e5266c5f7dc3cb1e4470c32 this is a test hello.c file
前面一大串的字符串表示版本号(commit id)
8.使用 git 命令回到上一个版本,必须先知道当前的版本号是多少。
在 git 里面,当前的版本号用 HEAD 表示,上一版本用 HEAD^ 表示,上上一版本用 HEAD^^ 表示 ,上100个版本用 HEAD~100 表示
9.使用如下命令,可以回到上一个版本
git reset --hard HEAD^
--hard 参数表示:
使用 git log 查看,发现最新版本的文件已经不见了
10.如果要恢复到最新的版本,可以翻看终端的历史记录,查看最新版本的 commit id 号,使用如下命令
git reset --hard f7f74f --表示恢复到 id 号为 f7f74f... 的文档,id号不用填完,git 会自动查找
11.如果终端的记录不能上翻了,git 还可以使用如下命令,查看曾经使用过的 git 命令
git reflog 该命令可以查看你使用过的每一条 git 命令
12.如果想放弃工作区的修改,回到修改前的状态,可以使用以下命令
git checkout -- hello.c
13.如果工作区的内容被修改,并且 add 到了暂存区,可以使用如下命令撤销操作
git reset HEAD hello.c git reset 命令既可以回退版本,也可以把暂存区的内容撤回到工作区
14.如果本地的文件被删除,想本地版本库也同时被删除,可以使用如下命令:
git rm hello.c 该命令可以删除版本库里面的文件
15.如果是在本地删错了文件,但版本库还有文件,可以使用如下命令:
git checkout -- hello.c git checkout 其实是一键还原工具,无论是删除恢复还是修改,都可以使用git checkout 回到以前版本
--------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------
如何创建和使用 git 的远程仓库
使用 GitHub 网站,可以创建自己的远程仓库,先注册一个 GitHub 账号
由于本地的 git 仓库和远程的 git 仓库是使用 ssh 协议加密进行传输的,因此,需要先查看 pc 机的主目录是否有 .ssh 文件夹
如果没有,可以使用以下命令创建 ssh key
ssh-keygen -t rsa -C "[email protected]"
把邮箱地址换成自己的邮箱后,一路回车,过程中不需要设置密码,顺利完成的话,会在主目录找到 .ssh 目录,里面有 id_rsa 和 id_rsa.pub 两个文件
这两个文件就是 ssh key 的密钥对,其中,id_rsa 是私钥,不能公开,id_rsa.pub 是公钥,可以公开
1.使用注册好的账号,登录 git hub ,打开“Account settings”,“SSH Keys”页面
2.点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容
3.点“Add Key”,你就应该看到已经添加的Key
通过以上步骤,就可以创建一个远程仓库了
假设已经在本地创建了一个本地版本库,又想在 github 创建一个远程库,并且让这两个仓库进行同步
1.登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库
2.在Repository name填入git_test,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库
3.如何让本地仓库与 GitHub 仓库进行关联,进入本地的git仓库,执行以下命令:
git remote add origin [email protected]:wenjs0620/git_test.git
其中,wenjs0620 是自己的github账户名,而远程库的名字是 origin ,可以修改,但这是 github 的默认叫法
4.可以使用以下命令,把本地仓库的内容推送到远程仓库
git push -u origin master 把当前分支master推送到远程
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,
Git不但会把本地的master分支内容推送的远程新的master分支,
还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令
5.经过以上步骤,从现在起,只要本地进行了 git commit 提交,就可以使用 git push origin master 进行远程推送
当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:
The authenticity of host ‘github.com (xx.xx.xx.xx)‘ can‘t be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,
需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。
Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:
Warning: Permanently added ‘github.com‘ (RSA) to the list of known hosts.
这个警告只会出现一次,后面的操作就不会有任何警告了。
总结一下:
要关联一个远程库,使用命令git remote add origin [email protected]:path/repo-name.git
关联后,使用命令git push -u origin master第一次推送master分支的所有内容
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改
--------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------
如何在远程库进行克隆
1.登录 github ,创建一个新的仓库,命名为 git_skills
2.勾选Initialize this repository with a README,
这样GitHub会自动为我们创建一个README.md文件。创建完毕后,可以看到README.md文件
3.现在,远程库已经准备好了,下一步是用命令git clone克隆一个本地库
git clone [email protected]:wenjs0620/git_skills.git
通过以上三个步骤,就可以从远程库克隆到本地库了
实际上,GitHub给出的地址不止一个,还可以用https://github.com/xxxxxx/xxxxxx.git这样的地址。
Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。
使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,
但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
git 分支与管理
使用 git 分支,是为了可以在分支上进行工作而不影响主分支,团队成员在各自的分支上工作,不会相互影响,
等到工作完成,可以把自己的分支合并到主分支
git 分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
git 标签管理
发布一个版本时,我们通常先在版本库中打一个标签,这样,就唯一确定了打标签时刻的版本。
将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。
Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针
(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。
1、首先,切换到需要打标签的分支上,使用以下命令:
git checkout master
2、使用以下命令,打上标签:
git tag v1.0
默认标签是打在最新提交的commit上的
3、如果要对历史的版本打上标签,可以使用以下方法:
git log --pretty=oneline --abbrev-commit 查看所有版本的id号
git tag v0.9 <commit_id> 对某个具体的版本打上标签
git tag 查看所有版本的标签
4、要查看标签的信息,可以使用以下的命令:
git show <tagname>
5、创建带有说明的标签,用-a指定标签名,-m指定说明文字:
git tag -a v1.0 -m "this is the first tag"
6、可以使用以下命令,对标签进行删除:
git tag -d <tag_name>
7、标签只会在本地保存,要推送到远程,可以使用如下命令:
git push origin <tag_name> 推送某个具体标签到远程
git push origin --tags 推送所有未推送的标签到远程
8、如果标签已经推送到远程,要删除标签,可以使用以下命令:
git tag -d <tag_name> 先删除本地标签
git push origin :refs/tags/v0.9 从远程删除
-----------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------
使用 git 忽略特殊文件
有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等。
每次git status都会显示Untracked files ...,有强迫症的童鞋心里肯定不爽。
好在Git考虑到了大家的感受,这个问题解决起来也很简单
在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。
所有配置文件可以直接在线浏览:https://github.com/github/gitignore
忽略文件的原则是:
1、忽略操作系统自动生成的文件,比如缩略图等;
2、忽略编译生成的中间文件、可执行文件等,自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
3、忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
最后一步就是把.gitignore也提交到Git,就完成了!
当然检验.gitignore的标准是git status命令是不是说working directory clean。
使用Windows的童鞋注意了,如果你在资源管理器里新建一个.gitignore文件,它会非常弱智地提示你必须输入文件名,
但是在文本编辑器里“保存”或者“另存为”就可以把文件保存为.gitignore了。
有些时候,你想添加一个文件到Git,但发现添加不了,原因是这个文件被.gitignore忽略了:
如果你确实想添加该文件,可以用 -f 强制添加到Git:git add -f App.class
或者你发现,可能是.gitignore写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore命令检查:、
git check-ignore -v App.class
.gitignore:3:*.class App.class
Git会告诉我们,.gitignore的第3行规则忽略了该文件,于是我们就可以知道应该修订哪个规则。
忽略某些文件时,需要编写.gitignore
.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
总结 Git 的使用方法:
第一次使用 git :
git config --global user.name "wenjs"
git config --global user.email "[email protected]"
本地先新建一个目录: mkdir -p git_test/
对目录进行初始化: git init git_test
添加文件到本地仓库: git add hello.c
提交文件到本地仓库: git commit -m "this is a git test file"
查看仓库状态: git status
查看文件修改情况 git diff hello.c
查看历史版本: git log --pretty=oneline
恢复到最新版本: git reset --hard f7f74f
放弃工作区修改:git checkout -- hello.c
撤销暂存区修改:git reset HEAD hello.c
远程同步,创建密钥对:ssh-keygen -t rsa -C "[email protected]"
远程与本地关联:git remote add origin [email protected]:wenjs0620/git_test.git
内容从本地推送到远程:git push -u origin master
从远程克隆到本地:git clone [email protected]:wenjs0620/git_skills.git
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
查看分支合并图:git log --graph
新建一个标签,默认为HEAD,也可以指定一个commit id: git tag <name>
指定标签信息:git tag -a <tagname> -m "blablabla..."
用PGP签名标签:git tag -s <tagname> -m "blablabla..."
查看所有标签:git tag
推送一个本地标签:git push origin <tagname>
推送全部未推送过的本地标签:git push origin --tags
可以删除一个本地标签:git tag -d <tagname>
删除一个远程标签:git push origin :refs/tags/<tagname>