git学习笔记
基本概念
工作区:开发人员本地机器中的代码文件存放的位置(本地可见)
暂存区:是开发人员可以随意修改的一个区域,相当于在真正提交前的一个整理的空间
版本库:git为我们创建的一个分支,一般是master
远程库:多个开发人员的一个中央控制机
常用命令
基础命令
1.建议选择一个空的文件夹作为工作空间,执行命令初始化工作空间
git init
执行git init后,工作空间会出现一个.git的隐藏文件,这个文件就是git仓库
2.提交代码命令,提交代码分为两个步骤,首先将代码提交到暂存区,然后才能上传到master
第一步,将工作区的代码提交到暂存区
git add 文件名
第二步,将暂存区的代码提交到仓库
git commit -m “文字描述”
第三步,将仓库中的文件提交到主干
git push -all
以上命令的参数记不住的话,可以输入git + 关键字,就会出现提示,根据提示选择参数,git shell还是很人性化的。
3.假如不知道仓库中是否是最新代码,或者想知道仓库和暂存区的相关信息,可以使用命令来查询当前状态
git status
4.当工作区和暂存区、暂存区与仓库之间的代码冲突可以使用命令查看修改
git diff 文件名称
5.查看提交的历史记录命令
git log
6.版本回退
git reset --hard HEAD^(此处的肩括号有几个就表示回退到第几次提交,这个方法不够优秀
git reset --hard 版本号(版本号写前六位即可,git会自动查询)
7.版本前进
如果回退后,再想前进,使用会退命令加上想要前进的版本号即可,也就是说想跳到那个版本,只要指定版本号即可
如果忘记版本号也不要怕,git为我们提供这样的人性化的命令可以查询到前进的版本号
git reflog
远程仓库
1.创建ssh-key命令
查看git的所有配置
git config --list
设置git的用户名
git config --global user.name “用户名”
设置git的邮箱
git config --global user.email “邮箱”
生成git的公钥和密钥
ssh-keygen -t rsa -C "youremail@example.com"
执行完命令,会在当前文件夹生成两个文件id_rsa(秘钥)和id_rsa.pub(公钥),秘钥保留在本地,只能自己知道,公钥填写到gitlab上,这样就形成远程仓库和本地的关联
2.创建一个远程仓库
通过gitlab添加一个仓库,可以添加一个readme文件,用来测试能否成功下载到本地,执行命令,将gitlab中的仓库下载到本地
git remote add origin git@github.com:michaelliao/learngit.git
3.把远程仓库跟新到本地工作空间
git clone git@github.com:michaelliao/gitskills.git
4.本地库推送到远程库
在当前库中运行cmd,执行以下命令(第一次推送添加参数“-u”,以后推送不用添加)
git push -u origin master
5.分支—分支就是一条时间线
为了保证仓库的安全性,git的提交过程为(本地工作空间–>暂存区–>仓库–>分支–>远程仓库)
6.创建分支
创建一个名称为dev的分支
git branch dev
切换到新建的分支
git checkout dev
以上两条命令合并执行
git checkout -b dev
查询本地分支
git branch
查询远程仓库的分支
git branch -a
7.合并分支
切换回master分支,执行合并命令
git merge dev
8.删除分支
git branch -d dev
9.解决冲突
当两个分支上的内容不同,并且合并这两个分支的时候出现的问题,此时需要我们手动的解决冲突,然后再提交
使用命令查看分支进行图
git log --graph
实例:git log --graph --pretty=oneline --abbrev-commit
10.合并策略
合并dev到master上
git merge --no-ff -m "merge with no-ff" dev
合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
11.隐藏、恢复当前分支
隐藏命令
git stash
查看隐藏列表
git stash list
工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了
12.强行删除分支命令
git branch -D feature_name
13.查询远程库信息
查询远程库信息
git remote
查询远程库详细信息
git remote -v
14.协作开发
当多人协作开发时,别人克隆代码只有master分支,无法看到你的dev分支,这是执行命令,克隆指定的分支
克隆指定的分支
git checkout -b dev origin/dev
15.两人同时推送时,后推送的那个人和远程仓库不同,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送;git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接
git branch --set-upstream dev origin/dev
16.多人协作的工作模式通常是这样:
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
创建本地分支和远程分支的链接关系
git branch --set-upstream branch-name origin/branch-name
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
17.创建标签
创建标签
git tag 【tag_name】
补写标签
git tag 【tag name】 【commit id】
查看标签
git show 【tag name】
18.删除标签
git tag -d 【tag name】
19.推送标签
git push origin 【tag name】
20.一次性推送全部尚未推送到远程的本地标签
git push origin --tags
21.查询当前tag列表
git tag
22.删除远程标签
先删除本地标签
git tag -d 【tag name】
再删除远程标签
git push origin :refs/tags/【tag name】
23.关联码云
注册码云后,添加公钥,将本地和码云关联起来
git remote add origin git@gitee.com:liaoxuefeng/learngit.git
24.git关联远程库同时关联码云
仍然以learngit本地库为例,我们先删除已关联的名为origin的远程库:
git remote rm origin
然后,先关联GitHub的远程库:
git remote add github git@github.com:michaelliao/learngit.git
接着,再关联码云的远程库:
git remote add gitee git@gitee.com:liaoxuefeng/learngit.git
现在,我们用git remote -v查看远程库信息,可以看到两个远程库:
git remote -v
gitee git@gitee.com:liaoxuefeng/learngit.git (fetch)
gitee git@gitee.com:liaoxuefeng/learngit.git (push)
github git@github.com:michaelliao/learngit.git (fetch)
github git@github.com:michaelliao/learngit.git (push)
25.Git显示颜色
git config --global color.ui true
26.忽略文件
推送时会有不想推送到git的文件,我们可以编写.gitignore文件,将文件名填写到配置文件,这样推送时就会忽略这些文件。
27.配置别名
当我们执行命令git status,输入的长且容易错,所以我们可以设置命令,执行
git config --global alias.st status
设置后,执行git st和git status是相同的
每个仓库的Git配置文件都放在.git/config文件中
28.搭建自己的git服务器
搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过几条简单的apt命令就可以完成安装。
假设你已经有sudo权限的用户账号,下面,正式开始安装。
第一步,安装git:
$ sudo apt-get install 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
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:
$ sudo chown -R git:git 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.
剩下的推送就简单了。
git常用命令分类总结
配置
git config
基础操作
创建版本库
git init
将文件添加到版本库,添加到暂存区
git add
回退暂存区里的文件
git reset HEAD
删除暂存区和分支上的文件,同时工作区也不需要
git rm file_path
删除暂存区或分支上的文件, 但工作区需要使用, 只是不希望被版本控制(适用于已经被git add,但是又想撤销的情况)
git rm --cached file_path
将文件添加到版本库,提交到仓库
git commit
查看仓库状态
git status
查看仓库中的具体修改
git diff
查看提交的历史记录
git log
查看提交的历史记录,显示单行
git log --pretty=online
查看命令历史
git reflog
版本回退
git reset --hard
回退到上个版本
git reset --haed HEAD^
回退到上上个版本
git reset --haed HEAD^^
回退到具体某个提交
git reset --hard commit_id
撤销修改,丢弃工作区的修改
git checkout --file
撤销修改,丢弃已经进入暂存区的修改
git reset HEAD file
删除文件
git rm file
分支管理
查看分支
git branch
git branch -v
git branch -av
创建分支
git branch branchname
切换分支
git checkout branchname
合并分支
git merge
删除分支
git branch -d
远程仓库
添加远程仓库
git remote add
推送本地内容到远程仓库
git Push
从远程克隆仓库到本地
git clone
修改本地指向的远程仓库地址
git remote set-url
获取远程数据的变更
git fetch
git pull
查看远程仓库的信息
git remote [-v]
建立本地分支和远程分支的关联
git branch --set-upstream <Iname> origin/<mame>
删除远程分支
git push origin --delete branchname
标签管理
创建标签
git tag -a <tagname> -m <comment> <commit_id>
查看标签,所有标签
git tag
查看标签,指定标签
git show <tagname>
删除本地标签
git tag -d <tagname>
删除远程标签
git push origin:refs/tags/<tagname>
git push origin --delete <tagname>
git push origin:<tagname>
推送标签到远程,单个标签
git push origin <tagname>
推送标签到远程,所有未推送的标签
git push origin --tags
进阶操作
查看工作区经过修改的文件(红色显示)
git status
将工作区文件添加到暂存区(变成绿色)
git add
删除暂存区指定文件,工作区不受影响
git rm --cached 文件名
用暂存区文件替换工作区文件(危险,会清除工作区中未添加到暂存区的改动)
git checkout --文件名
用HEAD指向的分支中的文件替换暂存区和工作区的文件(危险,会清除暂存区和工作区的改动)
git checkout HEAD 文件名
暂存命令
git stash save "暂存的备注"
查看暂存记录
git stash list
取回暂存代码
git stash pop
取消【取回暂存代码】
git reset --hard