git学习文档

1安装git
下载安装包默认安装
在命令行输入
git config --global user.name “your name”
git config --global user.email “your email”

2创建版本库
创建版本库(仓库repository)
#创建目录 mkdir
#进入创建目录 cd
#显示当前目录 pwd
#返回上一级目录 cd …
#显示当前目录 ls

初始化一个仓库
#把目录变成git可管理的仓库 git init
##自动生成了master分支##

新建文件
#创建文件 touch
#创建文件并打开 vi
##vi有命令模式和编辑模式两种,默认进入命令模式##
#进入编辑模式 i或者Insert
#编辑模式下退回命令模式 ESC键
#命令模式下 w保存
ZZ或:wq保存并退出
:q!放弃修改并退出
:e!放弃修改但不退出
#查看文件内容 cat

添加文件到仓库
#添加文件到暂存区 git add
##文件名用空格隔开可一次添加多个文件,filename/添加文件目录及子目录下所有文件,filename/.py添加文件目录下所有.py文件,add . 或者 add --all添加所有文件##
#提交文件到分支 git commit -m “wrote a readme file”
##git commit是提交命令,-m后输入本次提交的声明。提交前必须add文件再commit。commit一次性提交很多文件,可以多次add不同的文件##
#查看工作区状态 git status
##查看未被管理或未提交的文件##
#查看修改内容 git diff
##查看工作区和暂存区和分支中的不同##
#查看修改日志 git log
##在后面再加上—pretty=oneline简化版日志##

3时光穿梭
版本回退
#退回上一个版本 git reset --hard HEAD^
##退回上一个推送到分支的版本,上一个版本是HEAD,上上个版本是HEAD^,上100个版本是HEAD~100##
#查询commit记录 git reflog
##记录了每一次的命令,可以找到commit id,并通过id恢复相应版本
#退回到指定版本 git reset –-hard f44d9
##只要命令行窗口没有关掉还可以再找回新版本,写上想找回的版本的commit id的前几位就行

工作区和暂存区
##目录或者仓库就是一个工作区,工作区有一个隐藏目录.git,是Git的版本库,其中最重要的是stage(或者index)的暂存区,还有自动创建的第一个分支master以及指向master的一个指针HEAD。往Git版本库添加文件时先git add实际就是把文件修改添加到暂存区,git commit实际上就是把暂存区的所有内容提交到当前分支。git commit之后暂存区就是空白的。##

管理修改
##(Git跟踪管理的是修改而不是文件)每次提交的是修改的部分的内容而不是整个文件。##

撤销修改
#撤销工作区的修改 git checkout –或者git restore
##实际上是用版本库的版本替换工作区的版本##
#撤销暂存区的修改 git reset HEAD 或者git restore --staged
##已经add到暂存区了,重新放回到工作区,再进行丢弃工作区修改的操作就可以撤销未commit前的所有修改。##
##如果已经commit了但是还没有推送到远程版本库,通过版本回退撤销修改。如果已经提交到远程版本库了,那就凉凉。##

删除文件
#删除暂存区的文件 rm
#删除版本库的文件 先git rm 再git commit
##如果没有推送到版本库就被删除的文件是无法恢复的。##

4远程仓库
远程仓库
##服务器或者GitHub,本地git仓库和GitHub仓库之间的传输是通过SSH加密的##
##在用户主目录下查看.ssh目录,其中有私钥和公钥两个文件##
##ssh-keygen -t rsa -C “email@.com” #创建SSH Key。##
##在GitHub网页setting中SSH Key页面添加公钥。##

添加远程仓库(在GitHub创建一个Git仓库)
在GitHub上create a new repository

#关联本地仓库和远程仓库 git remote add origin git@github.com:jiangfu
linfangxu/learngit.git 或者git remote add origin git https://github.com/jiangfulinfangxu/le
arngit.git
##在本地的仓库运行此命令,后面是网址.git,可以把本地仓库与远程仓库进行关联##
##origin是Git默认的远程库叫法,可将origin改成github方便与码云的gitee区分,这样一个本地仓库就可以同时关联GitHub和gitee##
#查看关联远程库 git remote -v

#把分支从本地库推送到远程库 git push -u origin master
##把本地库的所有内容推送到远程库上(master分支),第一次推送加上-u,不仅会推送还会将本地和远程进行关联。之后的推送就可以简化命令成git push origin master##

克隆一个本地库
#从远程仓库克隆到本地 git clone git@github.com:jaingfulinfangxu/gitskills.git 或者 git clone https://github.com/jiangfulinfangxu/gitskills.git
##本地不可有相同名称的文件夹##

5分支管理
创建分支和合并分支
#创建并切换到<分支名>分支 git switch -c <分支名>或git checkout -b <分支名> ##相当于创建分支git branch <分支名> 和 切换分支git checkout <分支名> 两条命令##
#查看所有分支 git branch
#切换分支 git switch <分支名>或者git checkout <分支名>
#合并分支的工作成果到当前分支 git merge <分支名>
##fast-forward快进模式指的是直接把当前分支指向另外分支的当前提交,合并速度快,并不是每次都能fast-forward##

ff合并模式

#删除分支 git branch -d <分支名>
##合并完成之后可以放心地删除分支(卸磨杀驴)但是不能在当前分支删除当前分支##

#找回已经删除的分支 git branch <分支名> sha-1
##值根据删除分支所指向的commit对象的sha-1值(删除命令执行后的提示括号中的十六进制数值),以此为对象创建一个分支(如果忘记sha-1的值可通过git reflog找回)##

合并冲突(必须手动解决)
##当不同的分支合并时产生冲突时,即两个分支对同一个文件进行了不同的修改,不能强行合并,必须手动解决冲突后,git status可看到发生冲突的文件,打开冲突的文件,Git使用<<<<<,=====,>>>>>标记出了不同的分支的不同内容,需要手动修改后保存。再git add和git commit -m “” 进行提交。可以通过git log --graph(git log --graph --pretty=oneline --abbrev-commit)看到分支的合并情况。最后再删除分支完成工作##

分支管理策略
##合并时如果是fast forward模式,删除分支后就会丢失分支信息,如果强制禁用fast forward模式,Git在合并时就会生成一个新的commit,在分支历史上就可以看到分支信息。##
#–no-ff方式的git merge git merge --no-ff -m “merge with no-ff” <分支名> ##–no-ff参数表示禁用fast forward,因为要创建一个新的commit所以加上-m “”的commit描述。(ff模式删掉分支后就看不出曾经做过合并,no-ff能够看到所有合并历史)##

no-ff普通合并模式
##分支管理中master应该是非常稳定的,一般不在master分支上工作,dev是不稳定的,一般在dev上干活,每个人有自己的分支,时不时地往dev分支上进行合并,master一般只用于新版本的发布。##

分支管理

Bug分支(通过新的临时分支修复bug,合并分支后将临时分支删除)
#“储藏”当前工作现场 git stash
##当bug急需修复,但是另外的dev上的工作还没有提交时,使用stash后用status查看到的工作区就是干净的,可以放心创建分支来修复bug##
#回到之前保存的工作现场并删除工作现场 git stash pop
##相当于恢复git stash apply和删除git stash drop两条命令##
#查看工作现场 git stash list

##场景及流程:当master中有bug急需修复,但是dev工作未完成未提交时。先git stash保存dev当前工作现场,新建一个分支用于修复bug,修复后直接合并到master。由于dev是从早期master分支出来的,所以bug在dev中也存在,可以重复操作提交一次,但是有更简单的方法,只需要将修复bug的提交“复制”到dev分支中(只复制修复bug 的这个修改,并不是整个的分支合并),Git提供了一个cherry-pick命令,用于复制一个特定的提交:git cherry-pick c38ffd修改操作编号,对一个文件进行修改(如果bug修复的文件和dev文件同时进行过修改,则必须保存dev的stash,操作后改文件变成bug修复的文件)##

Feature分支(新功能开发夭折情况)
#删除未合并分支 git branch -D <分支名>
##一个分支没有被合并,如果删除将丢失所有修改,使用-D强行删除##

多人协作
#查看远程仓库 git remote 或者 git remote -v
#推送本地分支到远程 git push <远程库名><分支名>
#抓取分支 git clone git@github.com:jiangfulinfangxu/learngit.git
##在另一台电脑(需要把SSH Key添加到GitHub),克隆下来只能看到本地的master分支
#创建本地dev分支 git checkout -b dev <远程库名>/dev
##需要创建远程origin的dev分支到本地,然后才可以在dev上继续需改并push到远程##
#从远程库抓取最新的提交 git pull
##如果不同的人对同一个分支的同一个文件进行了修改并尝试推送,那么就会因为冲突而推送失败。解决方法是:先用把最新的提交抓下来,在本地合并,解决冲突之后再推送。##
#指定本地分支和远程分支的链接 git branch --set-upstream-to=origin/dev dev ##Pull之前需要指定本地dev分支和origin/dev分支的链接,再git pull,解决合并冲突之后再push##
##多人合作操作流程:1先git push origin <分支名>,2失败则说明有人先于我们push过了,那么我们git pull一下,在用git status查看一下状态,手动解决冲突再合并。3用git log --graph –pretty=oneline –abbrev-commit看一下分支合并历史。##

Rebase(做到Git的提交历史是一条干净的直线)
#整理提交历史 git rebase
##操作后再用git log查看分支历史发现提交变成了一条直线。原理就是改变本地commit修改内容的基准,把分叉的提交历史整理成一条直线。最后再push到远程##

6标签管理
##发布一个版本时通常在版本库中打上一个标签(tag),版本库的标签唯一确定打标签时刻的版本,标签和commit 挂钩,目的是方便版本查找##

创建标签(标签只存储在本地不会推送到远程)
#创建当前本地标签 git tag v1.0
##需要切换到对应的分支##
#查找到commit id get log –pretty=oneline --abbrev-commit
#对某一个commit打标签 git tag v1.0 commit id
#查看所有标签 git tag
##标签不是按照时间顺序列出而是按照字母排序##
#创建带有文字说明的标签 git tag -a v0.1 -m “” commit id
##-a指定标签名,-m指定说明文字##
#查看标签文字说明 git show v0.1

修改标签
#删除本地标签 git tag -d v0.1
#推送标签到远程 git push origin v1.0
#一次性推送全部尚未推送到远程的本地标签 git push origin --tags
#先在本地删除,在从远程删除 git push origin :refs/tags/v0.9

7GitHub使用
##个人开源项目可以放到GitHub上,通过GitHub也可以让别人参与自己的开源项目,同时也可以参与别人的开源项目##
##在被人的项目中点“Fork”就在自己的账号下克隆了一个仓库,然后在自己的账号下clone到本地,才能推送修改,在自己的仓库干完活推送完之后可以在GitHub上发起一个pull request,等待原作者是否接受。##

8码云(gitee)使用(国内的Git托管服务)
##用法与git一致,上传自己的SSH公钥,网址变成gitee.com##
#本地库关联远程库 git remote add <远程库名> git@gitee.com:HITSZ_CJA/learngit.git
##不同的远程库用不同的库名,网址相应改变。一个本地库可以同时关联并同步到多个远程库。##
#删除关联 git remote rm <远程库名>
#查看关联远程库信息 git remote -v
#推送本地库到远程 git push <远程库名> <分支名>
9Git配置
特殊文件忽略:在工作区的根目录下创建一个特殊的.gitignore文件,把要忽略的文件名填进去,Git就会自动忽略这些文件不提交这些文件,.gitignore文件本身需要提交到git并且可以对其进行版本管理。
特殊文件包括:操作系统自动生成的缩略图等,编译过程中生成的中间文件、可执行文件等,带有敏感信息的配置文件(包含密钥、口令等)
.gitignore文件需要推送到Git,检验.gitignore的标准是git status命令显示working directory clean
如果发现git add一个文件失败了,有可能是改文件被忽略了,可通过git add -f <文件名>进行强制添加,也可以通过git check-ignore -v <文件名> 查找到错误规则进行修改。

配置别名(相当于宏定义)
有些命令拼写复杂,可通过git config --global alias.<别名> <原名> 将命令宏定义。操作后在这台电脑的所有Git仓库下都可以使用。(去了—global则只会对本仓库有用)
配置都在隐藏文件.gitcofig中,也可以直接对文件进行修改。
例如: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”,操作后只需要git lg就行了。

搭建Git服务器
需要一个已经有sudo权限的用户账号
1安装git:sudo apt-get install git
2创建一个git用户用来运行git服务:sudo adduser git
3创建证书登录:收集所有需要登录的用户的公钥,把公钥导入到/home/git/.ssh/authotized_keys文件里,一行一个
4初始化Git仓库:先选定一个目录作为Git仓库,在目录下输入sudo git init --bare <仓库名>, 建立一个没有工作区的裸仓库,用户不能直接登录到服务器上去改工作区,并且服务器上的Git仓库一般以.git结尾,把owner改成git:sudo chown -R git:gir <仓库名>
5第二步创建的用户不允许登录shell,通过编辑文件/etc/passwd中的git❌1001:1001:,:/home/git:/bin/bash改为git❌1001:1001:,:/home/git:/usr/bin/git-shell。这样git用户可以正常通过ssh使用服务器仓库但是无法登陆shell。
6克隆远程仓库:git clone git@server:/srv/sample.git
另外如果需要强制控制用户权限,可以考虑使用Gitolite工具。
10GUI使用
推荐使用SourceTree,由Atlassian开发的免费的Git图形界面工具

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值