Git操作步骤-----详细版
- Git操作步骤-----详细版
- 本地仓库
- 安装:
- 在Linux上安装
- 在Windows上安装git
- 项目搭建
- 提交到仓库
- 小结:
- 查看状态结果
- 小结:
- 版本回退
- 工作区和暂存区
- 撤销修改
- 删除文件
- 安装:
- 远程仓库
- 连接远程仓库
- 添加远程库
- 从远程仓库克隆
- 分支管理
- 创建与合并分支
- 解决分支冲突
- BUG分支
- 多人协作
- 小结
- rebase
- 标签管理
- 新建标签
- 小结
- 删除标签
- 小结
- 特殊文件的忽略
- 配置别名
- 本地仓库
- Linux搭建git服务器
- 管理公钥
- 小结
本地仓库
安装:
在Linux上安装
1.检查是否安装了git 终端输入:$ git 返回结果若出现: The program 'git' is currently not installed. You can install it by typing: sudo apt-get install git 则在你的机器上没有安装Linux,而Linux也会很贴心的给你提示如何安装 2.安装命令 sudo apt-get install git
在Windows上安装git
- 首先去git官网下载安装程序: git下载网址,选择默认安装
详细安装步骤:
这里的安装步骤就不一一详细撰述了,百度即可
- 在快捷菜单栏里找到
Git
->Git Bash
当出现了一个类似命令行的窗口时,即安装成功,
安装成功后,还需要进行设置(优先选择全局安装,,方便以后使用)
$ git config --global user.name "Your Name" $ git config --global user.email "[email protected]"
安装上述命令,给控制系统自报家门
注意:
git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
项目搭建
首先要规划好你的版本库(即Git仓库),在这个目录里边,每个文件的修改、删除、增加,Git都能跟踪,方便我们在任何时间里都可以追踪历史,或者回到过去,将某个历史版本复原
- 在
git bash
终端里,切换到你的目录下,创建一个空目录$ mkdir gitdocs // 新建一个gitdocs文件夹 $ cd gitdocs // 打开gitdocs文件夹 $ pwd // 查看当前所在位置 /e/Github/gitdocs // 当前所在目录
如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。
- **通过
git init
命令将这个目录转变成Git
可以管理的仓库 **$ git init Initialized empty Git repository in /e/Github/gitdocs/.git/
此时,我们的本地仓库就建立好了,而此时,这个仓库还是一个空仓库,这就需要我们去填充内容了
当你去你的文件夹里面去看时,会发现出现了一个
.git
的目录,这个目录就是用来跟踪管理仓库的,请勿随意乱动这里面的东西,以免破坏仓库,如果没有的话,可能已设置隐藏,口头语通过ls -ah
命令查看
- 着手文件的建立
$ touch readme.txt // 建立readme.txt文件 或者是直接用 $ vim readme.txt // Linux系统自带的vim文本编译器,可以在没有此文件的情况下自行创建文件 // 打开readme.txt文件进行编辑
详细vim操作命令:vim操作命令手册
提交到仓库
- 用
git add
命令上传到临时库$ git add readme.txt [readme2.txt] ... // 可以提交多个文件
- 用
git commit
命令告诉git,把文件提交到仓库$ git commit -m "[提交说明]" // 例如你修改了什么,或者是做了什么操作 执行后,会出现: 1 file changed // 新添加一个文件 2 insertions: // 插入了两行内容
注意:
Q:输入git add readme.txt,得到错误:fatal: not a git repository (or any of the parent directories)。Q:输入git add readme.txt,得到错误:fatal: not a git repository (or any of the parent directories)。 A:Git命令必须在Git仓库目录内执行(git init除外),在仓库目录外执行是没有意义的。 Q:输入git add readme.txt,得到错误fatal: pathspec 'readme.txt' did not match any files。 A:添加某个文件时,该文件必须在当前目录下存在,用ls或者dir命令查看当前目录的文件,看看文件是否存在,或者是否写错了文件名。
小结:
初始化一个Git仓库,使用git init命令。
添加文件到Git仓库,分两步:
1.使用命令git add ,注意,可反复多次使用,添加多个文件;
2.使用命令git commit -m ,完成。
3.使用 git status 查看结果,git status命令可以让我们时刻掌握仓库当前的状态
查看状态结果
$ git status
git status
命令可以让我们时刻掌握仓库当前的状态但是如果想要查看历史修改了什么,这时我们就需要用
git diff
命令查看了$ git diff readme.txt[文件名] diff --git a/readme.txt b/readme.txt index 460bb99..8546085 100644 --- a/readme.txt +++ b/readme.txt @@ -2,4 +2,4 @@ Git is a distributed version control system. Git is free software. this is git test1 thanks - +hello?? it's me!!
git diff
顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到,我们在最后一行添加了一行hello?? it's me!!
小结:
git status告诉你有文件被修改过 git diff可以查看修改内容。
版本回退
在我们每次提交项目时,都会对该版本进行一个
快照处理
,而这个快照在Git
中被称为commit
。当把文件弄乱了,或者误删了,此时我们就可以从最近的一个commit
中恢复,然后继续工作
- 查看历史记录
$ git log // 显示从最近到最远的提交记录,显示过多 $ git log --pretty=oneline // 将记录显示在一行 c5f4d8f3991a6e258beb709ede70426c5ab8b41e (HEAD -> master) 谢谢 14486e415dd995b3ef2bffbba9517e7d48d3c1a7 新增一行数据 57350b53707aaa0f597cd0b0d6c37481cc0362e1 add distributed b6d9d6e55f82a622b96373f76ddb00f706e8a795 wrote a readme file
- 回退版本
$ git reset --hard HEAD^ // 回退到上一个版本 // 在Git中,用HEAD表示当前版本,也就是最新的提交,上一个版本就是HEAD^,上上一 个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成 HEAD~100 $ git reset --hard [append GPL的commit id] // 随意取前面几个十六进制数,最好是五个以上,如果有重复 的则再取一位
- 返回到最新版本
$ git reflog // 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本
工作区和暂存区
- 工作区
我的gitdocs文件夹就是一个工作区
- 版本库
.git
隐藏目录中即为Git的版本库版本库中,最重要的就是成为stage(或者叫index)的暂存区,还有Git自动创建的第一个分支
master
,以及指向master
的一个指针HEAD
git add把文件添加进去,实际上就是把文件修改添加到暂存区; git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。 因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
撤销修改
工作区
想直接丢弃工作区的修改时,用命令git checkout --
。
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
暂存区
用命令git reset HEAD
可以把暂存区的修改撤销掉(unstage),重新放回工作区:
删除文件
两种方法 1. $ rm
// 删除工作区的文件 2. $ git rm // 删除版本库里的文件 $ git commit -m "description" // 删除后提交 注意:
如果删错了,此时我们可以把版本库里的最新版本恢复到本地工作区 $ git checkout --
但是,从来没有被提交到版本库就被删除的,是无法恢复的
远程仓库
连接远程仓库
搭建SSH
$ ssh-keygen -t rsa -C "[你的邮箱]" 步骤: 第1步:在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。 第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容,点“Add Key”,你就应该看到已经添加的Key
添加远程库
在GitHub上新建一个
Ceate a new repository
仓库仓库名字填好后,直接下一步默认选项,最后点击
Create repository
后就成功建立了一个新的git仓库在本地的
gitdocs
下运行命令$ git remote add origin [email protected]:[账户名]/[仓库名].git
- 将本地仓库的所有内容推送到远程仓库
$ git push -u origin master | [分支名]
注意:
第一次需要加
-u
同时,当第一次使用Git的
clone
或者push
命令时,会得到一个警告,从事需要确认SSH
的key
是否有效,确认后按回车即可继续 这个警告只会出现一次
推送成功后,就可以查看远程仓库的内容了
- 之后再进行提交后,就可以简化命令
$ git push origin master
从远程仓库克隆
$ git clone [email protected]:[账户名]/[仓库名].git // ssh模式 或者 $ git clone https://github.com/[账户名]/[仓库名].git // https模式
想要克隆一个仓库,就得需要知道他的地址
Git支持多种协议:https、ssh(速度最快)
分支管理
创建与合并分支
master
称为主分支,也是Git默认的分支
HEAD
严格来说不是指向提交,而是指向master
,master
才是指向提交的,所以,HEAD
指向的就是当前分支。创建分支
$ git checkout -b [分支名] // 在终端中可以看到变化,master改为[分支名],创建并切换分支
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:$ git branch [分支名] $ git checkout [分支名]
git branch
命令会列出所有分支$ git branch // 查看所有分支
合并分支
首先,切换到master主分支上,再执行以下命令 切换:$ git switch master 或者 $ git checkout master 合并:$ git merge [分支名]
删除分支
$ git branch -d [分支名]
创建分支,在分支上进行工作,和直接在master上工作,效果是一样的,但是过程更安全
switch
切换分支这个动作,用switch更科学。因此,最新版本的Git提供了新的git switch命令来切换分支 创建并切换命令: $ git switch -c [分支名] 切换分支命令: $ git switch [分支名]
小结
查看分支:git branch 创建分支:git branch [分支名] 切换分支:git checkout [分支名]或者git switch [分支名] 创建+切换分支:git checkout -b [分支名]或者git switch -c [分支名] 合并某分支到当前分支:git merge [某分支名] 删除分支:git branch -d [分支名]
解决分支冲突
当两个不同的分支都修改了文件并都提交之后,在
master
也同时修改文件此时两个分支都有提交,据出现了两个分支都指向了master所在的HEAD,这种情况下,GIT无法实现快速合并,此时需要我们手动修改冲突的文件,并再次提交
$ git log --graph --pretty=oneline --abbrev-commit // 查看分支的合并情况
合并分支时,加上
--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而
fast forward合并就看不出来曾经做过合并。
BUG分支
利用
git stash
命令将当前工作环境隐藏起来修改BUG
新建临时分支,修改文件,保存提交
切换到master分支,并完成合并,最后删除临时分支
切换到工作分支
利用
git status
查看当前工作环境,但是它被隐藏了恢复方法
第一种: 用git stash apply恢复,但是恢复后,stash内容并不删除,需要用git stash drop来删除; 第二种: 用git stash pop,恢复的同时把stash内容也删了
利用
git status list
查看内容,此时看不到任何stash内容恢复指定的stash
$ git stash apply stash@{0}
在master分支上修复bug之后,可能在早期的分支之中,也会存在bug,该如何修复呢?
第一种:按照上述步骤再走一次
第二种:
$ git cherry-pick [commit id]
这里Git自动给分支做了一次提交,此时的
commit id
不同于之前的commit id
利用第二种,我们就可以不需要再重复一次步骤
小结 修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除; 当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场; 在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick
命令,把bug提交的修改“复制”到当前分支,避免重复劳动。 在软件开发的过程中,总会有无穷无尽的新的功能要不断的添加进来,最好是新建立一个分支。
在新功能被添加的过程之中,难免会有一些功能不再需要了,此时,需要删除分支,而这个分支却没有被合并,通过普通的方法删除是不凑效的。这里就要使用强行删除了
$ git branch -D [功能分支名]
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过
git branch -D强行删除。
多人协作
$ git remote $ git remote -v // 查询是否有push权限
多人协作的工作模式通常是这样:
- 首先,可以试图用
git push origin
推送自己的修改;- 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并;- 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin
推送就能成功!如果
git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to
。origin/ 这就是多人协作的工作模式,一旦熟悉了,就非常简单。
小结
- 查看远程库信息,使用
git remote -v
;- 本地新建的分支如果不推送到远程,对其他人就是不可见的;
- 从本地推送分支,使用
git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交;- 在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致;- 建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
;- 从远程抓取分支,使用
git pull
,如果有冲突,要先处理冲突。
rebase
- rebase操作可以把本地未push的分叉提交历史整理成直线;
- rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
标签管理
新建标签
tag就是commit id的一个别称
$ git tag [标签名] | [commit id] | [-m "标签说明文字"] // 给对应的commit id打上标签
$ git show
// 查看该标签的信息
注意:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。
小结
- 命令
git tag
用于新建一个标签,默认为HEAD
,也可以指定一个commit id;- 命令
git tag -a
可以指定标签信息;-m "blablabla..." - 命令
git tag
可以查看所有标签。
删除标签
$ git tag -d [标签名] 创建的标签都只存储在本地,不会自动推送到远程。因此,打错的标签可以在本地安全删除。
如果需要将某个标签推送到远程
$ git push origin
// 单独推送某个标签 $ git push origin --tags // 推送全部标签 如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
$ git tag -d
然后,从远程删除。删除命令也是push,但是格式如下:
$ git push origin :refs/tags/
要看看是否真的从远程库删除了标签,可以登陆GitHub查看。
小结
- 命令
git push origin
可以推送一个本地标签;- 命令
git push origin --tags
可以推送全部未推送过的本地标签;- 命令
git tag -d
可以删除一个本地标签;- 命令
git push origin :refs/tags/
可以删除一个远程标签。
特殊文件的忽略
- 忽略某些文件时,需要编写
.gitignore
;.gitignore
文件本身要放到版本库里,并且可以对.gitignore
做版本管理!$ git add -f [文件名] // 强制添加到git git check-ignore // 检查.gitignore规则
配置别名
$ git config --global alias.[别名] [原关键词] | ["命令行"] 例如: git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
--global
参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用;加上则对当前用户起作用,不加则只针对当前仓库起作用
Linux搭建git服务器
- 安装
git
$ sudo apt-get install git // 安装git
- 创建一个
git
用户,用来运行git
服务$ sudo adduser git
- 创建证书登录
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
- 初始化git仓库
先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令 $ sudo git init --bare sample.git
- 第五步,禁用shell登录
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑
/etc/passwd
文件完成。找到类似下面的一行:git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,
git
用户可以正常通过ssh使用git,但无法登录shell,因为我们为git
用户指定的git-shell
每次一登录就自动退出。
- 第六步,克隆远程仓库
现在,可以通过
git clone
命令克隆远程仓库了,在各自的电脑上运行:$ git clone git@server:/srv/sample.git Cloning into 'sample'... warning: You appear to have cloned an empty repository.
剩下的推送就简单了。
管理公钥
如果团队很小,把每个人的公钥收集起来放到服务器的
/home/git/.ssh/authorized_keys
文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。小结
- 搭建Git服务器非常简单,通常10分钟即可完成;
- 要方便管理公钥,用Gitosis;
- 要像SVN那样变态地控制权限,用Gitolite。
注意:
本章内容是根据廖雪峰老师的博客进行总结编写