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包管理式的操作系统,主要用于自动从互联网的软件仓库中搜索、安装、升级、卸载软件或操作系统。

apt-get命令一般需要root权限执行,所以一般跟着sudo命令。
例:sudo apt-get xxxx
 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 commitgit 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.txtgit 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_rsaid_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>

 

posted @ 2017-06-29 19:08  bell1991  阅读(661)  评论(0编辑  收藏  举报