
本文共 6886 字,大约阅读时间需要 22 分钟。
Git使用
请参考:
安装
下载
,安装。
which git
获取git安装的位置。git --version
获取git的版本
配置
git config --global user.name "Your name"
配置用户名git config --global user.email "emial@xxx.com"
配置emailgit config --list
显示配置列表git config user.name
显示配置的用户名git config user.email
显示配置的email
使用
创建新仓库
创建新文件夹,打开,然后执行 :
git init
以创建新的 git 仓库。
如下的例子,在learngit
文件夹下,使用git init
后,文件夹下有隐藏的.git
目录 
readme.txt
的文件,内容如下: Git is a version control system.Git is free software.
使用git status
,显示结果如下:

添加和提交
你可以提出更改(把它们添加到暂存区),使用如下命令:
git addgit add *
这是 git 基本工作流程的第一步;使用如下命令以实际提交改动:
git commit -m "代码提交信息"
现在,你的改动已经提交到了 HEAD,但是还没到你的远端仓库。
git status
可以查看状态
git log
可以显示提交的log 时光机穿梭
如果修改上面readme.txt
文件的内容为:
Git is a distributed version control system.Git is free software.
运行git status
命令

readme.txt
被修改了,使用git diff readme.txt
可以查看具体修改的区别 
git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到,我们在第一行添加了一个distributed单词。
版本回退
git log
命令显示从最近到最远的提交日志

--pretty=oneline
参数: 
d118b493c536f509cbb33c4ba9cd0cf8586dbfbe
是commit id
readme.txt
回退到上一个版本,也就是add distributed
的那个版本 git reset --hard HEAD^
HEAD
表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
用git log
再看看现在版本库的状态

append GPL
的版本该怎么?git reset --hard d118b
HEAD
指针,当你回退版本的时候,Git仅仅是把HEAD
从指向append GPL
: ┌────┐│HEAD│└────┘ │ └──> ○ append GPL │ ○ add distributed │ ○ wrote a readme file
改为指向add distributed:
┌────┐│HEAD│└────┘ │ │ ○ append GPL │ │ └──> ○ add distributed │ ○ wrote a readme file
Git提供了一个命令git reflog
用来记录你的每一次命令:
工作区和暂存区
工作区(Working Directory)- 电脑里能看到的目录,比如learngit
就是一个工作区
.git
,这个不算工作区,而是Git的版本库。 Git的版本库里存了很多东西,其中最重要的就是称为stage
(或者叫index
)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
第一步是用
第二步是用git add
把文件添加进去,实际上就是把文件修改添加到暂存区;git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
管理修改
Git跟踪并管理的是修改,而非文件
如果不用git add
到暂存区,那就不会加入到commit
中
撤销修改
1.工作区的文件修改后,此时git status
效果如下:

git restore <file>...
来丢弃working directory中的改变(文章)(教程中提示使用git checkout -- <file>...
) 总之,就是让这个文件回到最近一次
git restore
是git 2.23版本新增的命令,用来代替身兼数职的git checkout
。功能是一样的。git commit
或git add
时的状态。
使用git restore readme.txt
后,工作区的修改就回复为原来的样子了
2.工作区的文件修改后,被提交了到暂存区(使用git add readme.txt
)
commit
之前,你发现了这个问题。用git status
查看一下,修改只是添加到了暂存区,还没有提交: ,此时git status
效果如下: 
教程中提示的是
git reset HEAD <file>
可以把暂存区的修改撤销掉(unstage)
使用git restore --staged readme.txt
,再使用git status
获取状态

3.假设你不但改错了东西,还从暂存区提交到了版本库,该怎么办?
可参考版本回退删除文件
新添加一个test.txt

rm test.txt
,删除了文件,使用git status
查看状态 
git rm
删掉,并且git commit
命令
git rm
用于删除一个文件
xxxxxxxx learngit % git rm test.txtrm 'test.txt'xxxxxxxx learngit % git commit -m "remove test.txt"[master 2c659b0] remove test.txt 1 file changed, 1 deletion(-) delete mode 100644 test.txt
现在,文件就从版本库中被删除了。
2.另一种情况是,不想删除,删错了,可参考撤销修改
章节,使用git restore test.txt
远程仓库
先看下用户主目录下有没有.ssh
目录,如果有,再看看这个目录下有没有id_rsa
和id_rsa.pub
这两个文件
ssh-keygen -t rsa -C "youremail@example.com"
然后在Github上配置SSH
,创建一个repo

learngit
仓库下运行命令: git remote add origin git@github.com:winfredzen/learngit.git
添加后,远程库的名字就是
origin
,这是Git默认的叫法,也可以改成别的,但是origin
这个名字一看就知道是远程库。
把本地库的所有内容推送到远程库上
xxxxxx learngit % git push -u origin masterThe authenticity of host 'github.com (140.82.114.4)' can't be established.RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.Are you sure you want to continue connecting (yes/no/[fingerprint])? yesWarning: Permanently added 'github.com,140.82.114.4' (RSA) to the list of known hosts.Enumerating objects: 24, done.Counting objects: 100% (24/24), done.Delta compression using up to 12 threadsCompressing objects: 100% (19/19), done.Writing objects: 100% (24/24), 2.00 KiB | 1.00 MiB/s, done.Total 24 (delta 7), reused 0 (delta 0)remote: Resolving deltas: 100% (7/7), done.To github.com:winfredzen/learngit.git * [new branch] master -> masterBranch 'master' set up to track remote branch 'master' from 'origin'.
把本地库的内容推送到远程,用
由于远程库是空的,我们第一次推送git push
命令,实际上是把当前分支master
推送到远程。master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
从现在起,只要本地作了提交,就可以通过命令:
$ git push origin master
git push 命用于从将本地的分支版本上传到远程并合并。
命令格式如下: git push <远程主机名> <本地分支名>:<远程分支名> 如果本地分支名与远程分支名相同,则可以省略冒号: git push <远程主机名> <本地分支名>
删除远程库
如果添加的时候地址写错了,或者就是想删除远程库,可以用git remote rm <name>
命令。使用前,建议先用git remote -v
查看远程库信息: $ git remote -vorigin git@github.com:winfredzen/learngit.git (fetch)origin git@github.com:winfredzen/learngit.git (push)
然后,根据名字删除,比如删除origin:
$ git remote rm origin
从远程库克隆
参考:
git clone git@github.com:michaelliao/gitskills.git
你也许还注意到,
使用GitHub
给出的地址不止一个,还可以用https://github.com/michaelliao/gitskills.git
这样的地址。实际上,Git
支持多种协议,默认的git://
使用ssh
,但也可以使用https
等其他协议。https
除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http
端口的公司内部就无法使用ssh
协议而只能用https。
执行如下命令以创建一个本地仓库的克隆版本:git clone /path/to/repository 如果是远端服务器上的仓库,你的命令会是这个样子:git clone username@host:/path/to/repository例如克隆Github上的项目:git clone https://github.com/xxxx/xxxx.git
分支管理
一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。 当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化! 不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:
所以Git合并分支也很快!就改改指针,工作区内容也不变! 合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:
创建
dev
分支,然后切换到dev
分支:
$ git checkout -b devSwitched to a new branch 'dev'
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:
$ git branch dev$ git checkout devSwitched to branch 'dev'
然后,用git branch
命令查看当前分支:

git branch
命令会列出所有分支,当前分支前面会标一个*
号 在dev
分支上对readme.txt
作出修改后提交
$ git add readme.txt $ git commit -m "branch test"[dev b17d20e] branch test 1 file changed, 1 insertion(+)
切回到master
分支上
$ git checkout masterSwitched to branch 'master'
dev
分支的工作成果合并到master
分支上 xxxxxx learngit % git merge devUpdating c059cdf..b85e904Fast-forward readme.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
git merge
命令用于合并指定分支到当前分支
注意到上面的
Fast-forward
信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master
指向dev
的当前提交,所以合并速度非常快。
删除分支
git branch -d dev
switch
上面使用的是git checkout <branch>
来切换分支,还可以使用switch
创建并切换到新的dev
分支,可以使用:
$ git switch -c dev
直接切换到已有的master
分支,可以使用:
$ git switch master
解决冲突
创建一个feature1
分支,同时在feature1
和master
分支上,修改readme.txt
git merge feature1
合并时,提示用冲突,git status
命令效果如下:

readme.txt
文件内容如下: 
xxxxxx learngit % git add readme.txt xxxxxx learngit % git commit -m "conflict fixed"[master a09db92] conflict fixed
现在,master
分支和feature1
分支变成了下图所示:

git log --graph
命令可以看到分支合并图 
分支策略
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并。
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
转载地址:https://windzen.blog.csdn.net/article/details/49507661 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关于作者
