Git基本操作
http://gitbook.liuhui998.com/
1 touch file1
2 git init
3 echo "test1" >> file1
4 cat file1
5 git add /把文件修改添加到暂存区
6 git commit -m "test1" //把暂存区的所有内容提交到当前分支
7 git status
8 echo "test2" >> file1
9 git diff //没add之前查看不同内容
10 git log --pretty=oneline //commit之后查看几次的提交备注-提交的ID
11 git reset --hard HEAD~ //回退到上一个版本test2
12 cat file1
13 git reset --hard 3628164 //返回到test3
14 git reflog //返回未来查看版本ID
15 //增加新的内容“sjb”
16 cat file1
17 git checkout -- file1 //工作区,取消修改,还没有add
18 git reset HEAD file1 //把暂存区的修改撤销掉,重新放回工作区
19 //git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区
20 git checkout -- readme.txt //工作区,取消修改,还没有add
21 git reset --hard 3628164 //已经commit之后,撤销修改,直接版本回退
22 //(场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
23 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
24 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节)
25 rm test //已经commit删除文件
26 git checkout -- test //撤销删除文件
27 //(git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。)
28 git remote add origin https://github.com/bell/testproject.git //与远程仓库关联
29 git push origin master //第一次是加参数-u的,还是要重新输入用户名和密码,这个比较麻烦,怎么避免啊??
30 git clone git@github.com:michaelliao/gitskills.git //从远程库克隆
1 git checkout -b dev1 //创建并切换分支
2 git branch dev1 //创建分支
3 git checkout dev1 //切换分支
4 git push origin dev1 //可以远程到仓库,当前分支的名称
5 git branch //查看当前分支
6 git checkout dev //切换到dev
7 git merge dev1 //和当前分支dev合并
8 git branch -d <name> //删除分支
分支dev1 文件test修改
分支featurel文件test也修改
当合并分支的时候就会失败提示错误
查看test内容如下:Git用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容,我们修改后保存
打开文档手动修改如下内容:
然后add-commit-然后在合并git merge feature1
一、安装
1、在Linux上安装Git(Ubuntu)
你可以试着输入git
,看看系统有没有安装Git:
sudo apt-get install git
安装的时候提示如下错误:Unable to locate package
发现是因为新装的ubuntu系统,没有update的原因。然后进行update,输入命令:sudo apt-get update
然后在安装Git就可以啦
apt-get,是一条linux命令,适用于deb包管理式的操作系统,主要用于自动从互联网的软件仓库中搜索、安装、升级、卸载软件或操作系统。
1 sudo apt-get install package 安装包
2
3 sudo apt-get install package - - reinstall 重新安装包
4
5 sudo apt-get -f install 修复安装"-f = ——fix-missing"
6
7 sudo apt-get remove package 删除包
8
9 sudo apt-get remove package - - purge 删除包,包括删除配置文件等
10
11 sudo apt-get update 更新源
12
13 sudo apt-get upgrade 更新已安装的包
14
15 sudo apt-get dist-upgrade 升级系统
16
17 sudo apt-get dselect-upgrade 使用 dselect 升级
18
19 apt-cache depends package 了解使用依赖
20
21 apt-cache rdepends package 是查看该包被哪些包依赖
22
23 sudo apt-get build-dep package 安装相关的编译环境
24
25 apt-get source package 下载该包的源代码
26
27 sudo apt-get clean && sudo apt-get autoclean 清理无用的包
28
29 sudo apt-get check 检查是否有损坏的依赖
2、在Windows上安装Git
从 https://git-for-windows.github.io下载直接安装
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
二、获得一个Git仓库
1、一种是从已有的Git仓库中clone (克隆,复制);
git clone https://github.com/xxxx/gitproject
2、还有一种是新建一个仓库,把未进行版本控制的文件进行版本控制。
3、正常的工作流程
git的基本流程如下:
-
创建或修改文件
-
使用
git add
命令添加新创建或修改的文件到本地的缓存区(Index) -
使用
git commit
命令提交到本地代码库 -
(可选,有的时候并没有可以同步的远端代码库)使用
git push
命令将本地代码库同步到远端代码库
1 cd F:\git_doc
2 mkdir testproject //新建一个目录
3 cd testproject //打开这个项目
4 git init //初始化
5 ls -la //发现在此目录下存在.git的目录,意味着一个仓库初始化了
6 touch file1.txt file2.txt file3.txt //创建三个文件
7 vim file1.txt //写入内容
8 或是追加echo “test1” >> file1.txt //直接追加内容(三个文件都写入)
9 git add file1.txt file2 file3 //用git add命令把文件添加到缓存区
10 git commit -m “add 3 files”//把暂存区的所有内容提交到当前分支;使用-m
添加本次修改的注释,完成后就会记录一个新的项目版本。
11 git remote add origin git@github.com:defnngj/MyGit.git //连接到远程GitHub项目
12 git push origin master //将本地仓库同步到远端服务器,输入用户名和密码
13 git status //
命令可以让我们时刻掌握仓库当前的状态
add的时候在win下提示“warning: CRLF will be replaced by LF in GeneSmartStay/res/values-zh-rTW/strings.xml.The file will have its original line endings in your working directory.”这是因为:文件中换行符的差别导致的。这个提示的意思是说:会把windows格式(CRLF)转换成Unix格式(LF),这些是转换文件格式的警告,不影响使用。
三、版本管理
1、修改内容
现在修改file的内容,追加test11
1 echo “test4” >> file3.txt
修改了内容之后,我们需要查看这次和上次的不同
1 git diff file3
然后依旧是git add 和git commit
2、版本回退
现在我的file1文件总共做了三次修改,如下,每天都是添加了一行
test1
test11
test123
在实际工作中,我们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么。版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log
命令查看:
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
参数
现在我们回退到上个版本,也就是add test11;使用git reset
命令
在Git中,用HEAD
表示当前版本,也就是最新的提交3628164...882e1e0
(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
git log --pretty=oneline //查看提交日志,版本号
git reset --hard d9ca84997d59e //回退到这个版本号,前面几个字符串就可以,不用写全
cat file1 //查看文件的内容
其实这次修改了二个文件导致用git reset --hard HEAD^这个命令的时候报错,应该直接用版本号,如下
现在我们在test11下面,我们发现回退错了,想回到test123咋办呢?再次网上看找到版本号,回退回去(前提是我们这个命令行窗口还木有关闭啊),又回去啦!!!!
现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id
怎么办?
当你用$ git reset --hard HEAD^
回退到add distributed
版本时,再想恢复到append GPL
,就必须找到append GPL
的commit id。Git提供了一个命令git reflog
用来记录你的每一次命令:
小结:
-
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。 -
穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本。 -
要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。
我觉得嘛,暂存区就像购物车,没到付款的时候你都不确定购物车里的东西全部都是要的。。。每拿一件商品就付一次款。。。那才麻烦大了
git diff #是工作区(work dict)和暂存区(stage)的比较
git diff --cached #是暂存区(stage)和分支(master)的比较
只有git add 放在缓存中才会提交;第一次修改 -> git add
-> 第二次修改 -> git add
-> git commit
3、撤销修改
当已经修改了文档时候:echo “7891” >> file1,还没有add
我们用git status查看,会提示可以撤销修改的,git checkout ,现在返回到没有修改的
如果已经add了,我们用git reset HEAD file
可以把暂存区的修改撤销掉(unstage)---回到工作区域,然后用git checkout撤回
现在,假设你不但改错了东西,还从暂存区提交到了版本库,怎么办呢?还记得版本回退一节吗?可以回退到上一个版本。不过,这是有条件的,就是你还没有把自己的本地版本库推送到远程。还记得Git是分布式版本控制系统吗?我们后面会讲到远程版本库,一旦你把“stupid boss”提交推送到远程版本库,你就真的惨了……
git checkout -- file1 //file1前面刚开始没打空格死活不能撤销//git checkout -- file
命令中的--
很重要,没有--
,就变成了“切换到另一个分支”的命令
命令git checkout -- readme.txt
意思就是,把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit
或git add
时的状态。
小结
- 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
git checkout -- file
。 - 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令
git reset HEAD file
,就回到了场景1,第二步按场景1操作。 - 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
4、删除文件
如果用rm test命令
删掉了,并且git commit——然后git checkout test恢复
因为使用了git rm test.txt
,是同时删除了工作区和暂存区test.txt
文件,并且将删除的动作提交到了暂存区。git checkout -- test.txt
表示从暂存区中把test.txt
拎出来,覆盖到工作区。但是,此时暂存区也已经没有了test.txt
,是无法还原覆盖到工作区的。
正确的做法是 git checkout HEAD -- d1.txt
或 git checkout HEAD d1.txt
三、远程仓库
先注册GitHub账号。由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置
1、创建SSH Key
打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可
可以在用户主目录里找到.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对,id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人。
Windows的在C盘路径下
2、登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub
文件的内容:
点“Add Key”,你就应该看到已经添加的Key
当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
最后友情提示,在GitHub上免费托管的Git仓库,任何人都可以看到喔(但只有你自己才能改)。所以,不要把敏感信息放进去。
如果你不想让别人看到Git库,有两个办法,一个是交点保护费,让GitHub把公开的仓库变成私有的,这样别人就看不见了(不可读更不可写)。另一个办法是自己动手,搭一个Git服务器,因为是你自己的Git服务器,所以别人也是看不见的。这个方法我们后面会讲到的,相当简单,公司内部开发必备。
四、添加远程仓库
1、首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库: 在Repository name填入(注入英文,汉字可以输入,但是不显示名称),其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:
2、我们根据GitHub的提示,在本地的learngit
仓库下运行命令:
$ git remote add origin https://github.com/bell/testproject.git
把上面的bell
替换成你自己的GitHub账户名,否则,你在本地关联的就是我的远程库,关联没有问题,但是你以后推送是推不上去的,因为你的SSH Key公钥不在我的账户列表中。
添加后,远程库的名字就是origin
,这是Git默认的叫法,也可以改成别的,但是origin
这个名字一看就知道是远程库。
3、就可以把本地库的所有内容推送到远程库上:
git push -u origin master
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样:
4、从现在起,只要本地作了提交,就可以通过命令:
$ git push origin master //第一次是加参数-u的,还是要重新输入用户名和密码,这个比较麻烦,怎么避免啊??
五、常见错误和异常
如果输入$ Git remote add origin git@github.com:djqiang(github帐号名)/gitdemo(项目名).git
提示出错信息:fatal: remote origin already exists.
解决办法如下:
1、先输入$ git remote rm origin
2、再输入$ git remote add origin git@github.com:djqiang/gitdemo.git就不会报错了!
3、如果输入$ git remote rm origin 还是报错的话,error: Could not remove config section 'remote.origin'. 我们需要修改gitconfig文件的内容
4、找到你的github的安装路径,我的是C:\Users\ASUS\AppData\Local\GitHub\PortableGit_ca477551eeb4aea0e4ae9fcd3358bd96720bb5c8\etc
5、找到一个名为gitconfig的文件,打开它把里面的[remote "origin"]那一行
删掉就好了!
如果输入$ ssh -T git@github.com
出现错误提示:Permission denied (publickey).因为新生成的key不能加入ssh就会导致连接不上github。
解决办法如下:
1、先输入$ ssh-agent,再输入$ ssh-add ~/.ssh/id_key,这样就可以了。
2、如果还是不行的话,输入ssh-add ~/.ssh/id_key 命令后出现报错Could not open a connection to your authentication agent.解决方法是key用Git Gui的ssh工具生成,这样生成的时候key就直接保存在ssh中了,不需要再ssh-add命令加入了,其它的user,token等配置都用命令行来做。
3、最好检查一下在你复制id_rsa.pub文件的内容时有没有产生多余的空格或空行,有些编辑器会帮你添加这些的。
如果输入$ git push origin master
提示出错信息:error:failed to push som refs to .......
解决办法如下:
1、先输入$ git pull origin master //先把远程服务器github上面的文件拉下来
2、再输入$ git push origin master
3、如果出现报错 fatal: Couldn't find remote ref master或者fatal: 'origin' does not appear to be a git repository以及fatal: Could not read from remote repository.
4、则需要重新输入$ git remote add origingit@github.com:djqiang/gitdemo.git
git push -f origin master.强制提交
输入中文:打开Git Bash后,对窗口右键->Options->Text->Locale改为zh_CN,Character set改为UTF-8
六、从远程库克隆
假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆。
1、首先,登陆GitHub,创建一个新的仓库,名字叫testproject
2、我们勾选Initialize this repository with a README
,这样GitHub会自动为我们创建一个README.md
文件。创建完毕后,可以看到README.md
文件。
3、现在,远程库已经准备好了,下一步是用命令git clone
克隆一个本地库
$ git clone git@github.com:bell/testproject.git
或是https://github.com/bell/testproject.git
Cloning into 'gitmstsc'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
$ cd testproject
$ ls
README.md
注意把Git库的地址换成你自己的,然后进入testproject
目录看看,已经有README.md
文件了。
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone
命令克隆。
Git支持多种协议,包括https
,但通过ssh
支持的原生git
协议速度最快。
七、分支管理
(妈呀 终于到分支管理了,上面的学习也花费了一些时间,这是第二次学习了。。。。。下午了,比较累)
1、创建合并分支
1 git checkout -b dev 2 Switched to a new branch 'dev'//git checkout命令加上-b参数表示创建并切换 3 git branch //列出所有分支,当前分支前面会标一个*号 4 touch branch 5 git add branch 6 git commit -m "branch test" 7 git checkout master//切换分支
8 git merge div //合并到当前分支
小结
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>