gitgitgit

Published: by Creative Commons Licence

git学习分享

Git使用教程

Created 2018.02.12 by William Yu; Last modified: 2018.07.11-V1.0.8

Contact: windmillyucong@163.com

Copyright ©2018 William Yu. All rights reserved.


致敬Linus.

Reference:廖雪峰的官方网站


git-tutorial

Git安装

1.Windows

从Git官网直接下载安装程序,然后按默认选项安装即可。

安装完成后,在开始菜单里找到“Git”->“Git Bash”,运行即可。

2.Linux

sudo apt-get install git

初始化

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

git config –global 参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然你也可以对某个仓库指定的不同的用户名和邮箱。

Git使用简单介绍

基本操作

1.创建文件夹

创建代码项目文件夹,进入文件夹,添加代码文件(空文件夹是不能备份的啊,通常新建一个文本readme.txt)。

相当于搭建了一个仓库,里面放上了你要储存的瓜果蔬菜粮钱兵马。

#linux操作
mkdir ~/code/gittest
cd ~/code/gittest
vim readme.txt
#windows操作
在你新建的文件夹鼠标右键单击运行git bash即可
2.初始化为git仓库

给你搭建的仓库雇佣了一个门神秦叔宝尉迟恭。

git init
3.添加文件给git托管

告诉你的门神,我的仓库里面哪些东西是拜托你负责看管的。

git add ./readme.txt

当然你也可以使用如下命令直接添加项目文件夹下的所有文件到git。告诉你的门神,我的仓库里面的东西都是拜托你跟进的。

git add -A

然后使用如下命令提交改动,这里面your msg就是你对这次提交的注释。

git commit -m "your msg"
4.提交代码

然后在项目文件夹下添加你的代码等等各种文件。工作进行一段时间后,你的代码可能已经刚好得到了一个效果不错的运行结果,于是你打算备份一份。

通知一下你的门神,我刚刚对这仓库里做了改动,你的门神会检查仓库里的东西和上次有什么不同,并一丝不苟得记录下来。

git add -A
git commit -m "back-up"

一个良好的习惯是——每天睡觉前提交一次代码;每次重大改动前提交一次代码。

5.代码回滚

如果某一天,你不经意间改动了一些东西,代码突然蹦出了几百个error,项目文件夹改动得面目全非,而你无力回天的话,是时候让你的门神发挥神力了。

#把项目文件夹下的所有文件回退到上一个版本
git reset  --hard HEAD^
#自然,回退上上个版本就是
git reset  --hard HEAD^^
#如果要向前回退100个版本的话...
git reset  --hard HEAD~100

远程仓库

我们已经在本地创建了一个Git仓库,又想在github创建一个Git云仓库,只要有网就可以随地访问,并且希望这两个仓库进行远程同步。这样github的仓库可以作为备份,又可以和其他人通过该仓库来协作。

1.注册github账号或gitee账号

进入官网注册即可。

然后添加ssh key

[1]:创建SSH Key。

​ 在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsaid_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

$ ssh-keygen -t rsa -C "youremail@example.com"

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。

​ 如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsaid_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。gitee与此类似。(图片摘自廖雪峰的官方网站,版权归原作者所有)

github-addkey-1

为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。

当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。

2.创建仓库

首先,登录github上,在右上角找到“create a new repo”创建一个新的仓库。填入仓库名称。点击Create repository。完成。可以看到有一个http网址,值得注意的是github的http中间是github.com,而gitee是gitee.com,除此之外此外github和gitee用法完全相同。

3.将本地仓库关联至新创建的云仓库。

进入本地的代码项目文件夹,打开git

git remote add origin https://github.com/......#这里应该输入的是之前创建云仓库时的出现的http网址
4.然后推送本地代码到云端
git push -u origin master

然后输入你github的账户和密码即可。

注意:git remote add origin命令只需要在最开始关联仓库时运行一次,此后只需要使用git push推送即可。从现在起,只要本地作了提交,就可以通过如下命令:git push origin master把本地master分支的最新修改推送到github上了,现在你就拥有了真正的“分布式”版本库了。

5.下载

于是你在公司电脑上提交了代码,并且把它推送到了GitHub上,回到家之后再从远程库克隆到家里的电脑上,你就可以愉快得加班了。

登录GitHub,进入你感兴趣的项目,点击clone,复制https链接。

在你的电脑上建立一个文件夹,打开git,使用如下命令下载代码到文件夹

git clone https://github.com/....这里填写你刚刚复制的链接。

接着进行你在公司没有完成的工作,睡觉之前推送到Github上,第二天去公司clone新代码即可。

分支

截止到目前,你的仓库只有一条时间线,在Git里,这个分支叫主分支(master分支)

可以简单理解为每一个分支都是一个平行世界,创建分支分裂出另一个一模一样的世界,合并分支将两个世界合二为一。

1.创建分支
git branch dev #添加分支dev
git branch     #查看分支列表,会列出所有的分支,当前所处的分支前面会显示一个星号。
git checkout -b dev  #切换到dev分支

然后你可以在dev分支下继续你的代码,完全不影响master分支。

git checkout -b dev  #切换到dev分支
git commit -m "在dev分支上改动了..balabala."
2.合并分支
#把dev分支上的内容合并到分支master
git merge –no-ff dev   
#合并完成后,可以删除dev分支了
git branch -d dev      

注意,合并仍是有风险的,子分支被创建被改动之后再合并到主分支,如果这段时间里主分支也有一些提交改动,那此时合并结果到底依谁为准呢?两个宇宙对撞总要闹些风险出来的:

#合并冲突的解决
#尝试合并时,git报错:Automatic merge failed。
#接着你必须手动解决冲突后再提交
git status  #查看仓库状态
#Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
#手动修改为与主分支一致,然后合并

多人协作

到这里,我们的操作还远远不能感受git分布式版本控制的魅力所在。到目前为止,你的项目文件夹都只有你一个人在操作,然而linux开源哲学之一是——开源社区是一家,共同协作,免费共享。

通常做法:master主分支应该是非常稳定的,也就是用来发布新版本,一般情况下不要在上面进行开发,使用新建的dev分支用于你的代码开发,而代码确认稳定之后,可以合并到主分支master上来。你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

所以,团队合作的分支看起来就像这样:(图片摘自廖雪峰的官方网站,版权归原作者所有)git-br-policy

借由GitHub和gitee完成多人协作:

1.从远程库克隆
git clone https://github.com/...
#查看远程库的信息
git remote
git remote -v  #查看详细信息
2.推送分支
#当你本地的工作结束后可以提交推送到远程仓库
git push origin master
#或者推送其他分支
git push origin dev
3.抓取分支

描述这样一种情况:

​ 你和你的小伙伴在Github上的一个项目,你们两都已经将SSH Key添加该项目,这样你们都具有对该项目的推送权限。

​ 某一时刻你们从远程仓库clone了该项目,然后你做了你的那一部分任务,并上传到远程仓库,他做了他的那一部分任务,也试图上传到远程仓库,于是冲突就有可能发生。

【多人协作的工作模式通常是这样】:

  1. 首先,可以试图用git push origin <branch-name>推送自己的修改;

  2. 如果推送失败,则因为远程分支比你的本地更新,你的同事在你之前推送他的修改,所以你需要先用如下命令试图合并:

    git pull

  3. 如果合并有冲突,则手动解决冲突,并在本地提交;

  4. 没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>然后再运行命令git pull

.gitignore

有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files ...,有强迫症的童鞋心里肯定不爽。

好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件然后把要忽略的文件名填进去(每行一个),Git就会自动忽略这些文件。(摘自廖雪峰的官网)

当然你也可以使用!不忽略的文件名的格式告诉git当前文件夹下面,除了后面的文件我要监管,其他的忽略。

举第一个例子:

【场景描述】:

我有一个文件夹已经初始化为git仓库,然后里面放了5个文件分别叫:

1.txt2.txt3.txt4.txt5这是写给女票的情话.txt

和2个文件夹(非空文件夹,空文件夹或被自动ignore)分别叫:

我是一个正常文件夹我是一个私密文件夹里面有和女票的合照

自然你不会将5这是写给女票的情话.txt我是一个私密文件夹里面有和女票的合照文件夹上传到github上面去,除非你打算花点时间哄你女朋友开心。

【解决方案】:

所以你打算写个.gitignore

#在git文件夹下,终端运行vim
$: vim .gitignore
#在.gitignore文件里面写上下面几句
/.gitignore
/5这是写给女票的情话.txt
/我是一个私密文件夹里面有和女票的合照/
#然后保存退出,在终端提交代码
$: git add -A
$: git commit -m "add .gitignore"
$: git push -u origin master
举第二个例子:

【场景描述】:

我有一个文件夹已经初始化为git仓库,然后里面放了50个文件分别叫:

1.txt2.txt3.txt4.txt5这是写给女票的情话.txt6这是写给女票的情话.txt7这是写给女票的情话.txt ,… … ,50这还是写给女票的情话.txt

其实我试图描述的场景是代码文件夹下大多数文件不希望托管 到git的情形,而前面所述第一个例子恰恰是代码文件夹下大多数文件希望托管 到git的情形。

自然你不会将5这是写给女票的情话.txt一直到50这还是写给女票的情话.txt这么些文件托管到git,但是像例子一那样一条条添加到.gitignore又很累,所以我们换个思路——–做减法。

【解决方案】:

所以你打算写个.gitignore,不过这次有点不同了

#在.gitignore文件里面写上下面几句
/*  #表示忽略掉当前文件夹下所有文件
!/1.txt   #表示不忽略1.txt
!/2.txt
!/3.txt
!/4.txt
!/5.txt
#然后保存退出,在终端提交代码
$: git add -A
$: git commit -m "add .gitignore"
$: git push -u origin master

附加篇–简单总结

总结一下,使用gitee备份代码的最简单情形操作,就是这几句命令,可照猫画虎:

---------------------------------------以下只用执行一次--------
[1]安装git
[2]初始化git用户
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
#注意将“”里面的内容替换成你的名字和邮箱,
----------------------------------------以上只用执行一次--------


----------------------------------------新建一个git项目------
[1]新建一个代码文件夹
[2]把你的代码放进去
[3]在代码文件夹下运行git
[4]初始化为git仓库
$ git init
[5]将所有文件添加为托管
$ git add -A
[6]提交改动
$ git commit -m "这里面写上你的备注"
[7]在gitee上面创建远程仓库
[8]回到本地文件夹,将本地文件夹关联到远程仓库
git remote add origin https://gitee.com/......
#这里应该输入的是之前创建云仓库时的出现的http网址
[9]推送到远程仓库
$ git push -u origin master
-----------------------------------------新建一个git项目------




----------------------------------以后每天提交代码时只需要执行以下命令------
[1]将所有文件添加为托管
$ git add -A
[2]提交改动
$ git commit -m "这里面写上你的备注"
[3]推送到远程仓库
$ git push -u origin master
----------------------------------以后每天提交代码时只需要执行以上命令------

附加篇–常见问题处理

【问题描述1】error: failed to push some refs to

https://confluence.atlassian.com/bitbucketserverkb/git-lfs-fails-with-error-failed-to-push-some-refs-to-802591026.html

#出错时的情况:

# will @ Will in ~/Documents/blogs/YuYuCong.github.io on git:master o [16:06:54] C:128
$ git push -u origin master
Username for 'https://github.com': YuYuCong
Password for 'https://YuYuCong@github.com': 不告诉你
To https://github.com/YuYuCong/YuYuCong.github.io
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/YuYuCong/YuYuCong.github.io'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
【解决方案1】(或许是,反正我解决了)
#使用这条命令
$:git push -f origin master 
【问题描述2】error: Authentication failed
【解决方案2】
$:git config --system --unset credential.helper
【问题描述3】windows环境下出现bash: \302\226': command not found
【解决方案3】

https://blog.csdn.net/Xunzi229/article/details/52143940?locationNum=6

Contriuting / Contact

Have anything in mind that you think is awesome and would fit in this blog? Feel free to send a pull request.

Feel free to contact me anytime for anything.


License

CC0