Git教程(Linux)

持续更新中。。。

.安装及使用(Linux为例)

workspace工作区:新添加的,修改未add

stage暂存区:add后进入

repository本地仓库:commit后进入

remote远程仓库:push后提交到

# 显示当前的Git配置

 $ git config --list

#设置用户名和邮箱,即提交代码时的用户信息

 $ git config [--global] user.name "[name]" 

$ git config [--global] user.email "[email address]"


1.初始化一个Git仓库

1.1创建版本库 git init 初始化库(使用此命令将当前所在的目录变为git可管理的目录)

例:$ cd workspace  

      $ mkdir exercise1

      $ pwd

      /user/workspace/exercise

      $git init

2. 将文件添加到版本库

2.1 首先在当前目录下或子目录编写一个文件

例:day1.py

   print(“第一次学习使用Git,加油。”)

 

(1) 将文件添加到Git仓库中

    $ git add day1.py

(2) 将文件提交到Git

    $ git commit -m “worte a day1.py file” (下划线内容为注释)

commit 可一次提交多个文件,(所以add可以多次提交,也可一次提交多个文件)

 

    $ git add day2.py day3.py day4.py

    $ git commit -m “add 3 file” 

#添加所有修改的和新添加的 

$ git add .

#另一种写法 

$ git add -A

#由暂存区恢复到工作区(发现提交错了,退回一步)

 $ git reset HEAD <file>

#恢复上一次add提交的所有file

 $ git reset HEAD

#撤销修改操作,恢复到修改之前的,撤销add后位于工作区下进行的 

$ git checkout -- <file>

#删除文件,并将文件放入暂存区 

$ git rm <file1> <file2>

#改文件名,并将修改后的文件放入暂存区

 $ git mv <file-original> <file-rename>


    

二. 时间轴变化

1. Git status Git diff

修改day1.py 文件  ,使用Git status 查看(可时刻掌握仓库当前状态)

Git diff(可看出做了哪些修改)

在提交到仓库中(提交修改与提交新文件一样)

    $ Git add day1.py

    $ Git commit -m “所做修改的备注”  

1Git status告诉文件被修改过

2Git diff 哪里被修改了

三.版本回退

1.git log 查看提交的不同版本

f向下滚屏/b向下滚屏

j向下移动一行/k 向上移动一行

如果嫌输出信息多可以试试:$ git log --pretty=oneline

2.版本切换

回退到之前的版本 $ git reset --hard HEAD^

上一个版本HEAD^表示,上上个HEAD^^表示。

往上100个版本 HEAD~100 表示


git允许我们在版本之间切换----------- $ git reset --hard commit_id

例:$ git reset --hard c955842

切换前用 $ git log 查看提交历史,以便确定回退到哪个版本

要返回切换前的版本 $ git reflog 查看历史命令,以便确定到哪个版本

四. 工作区 暂存区

将文件提交到Git版本库是分两步:

1git add 将文件添加进去就是 将文件添加到暂存区

2git commit 提价修改 就是就是把暂存区所有内容提交到当前分支(创建版本库时,自动创建了master分支)

 

可以理解为:将需要提交的文件修改 统统放到暂存区,然后一次性提交暂存区所有修改。

1.git管理的是修改

而不是文件

对于每次的修改,如果不限加到暂存区中,就不会加入到commit

2.撤销修改

git checkout -- 文件名

将在工作区的修改全部撤销

1. 可能修改后还没放到暂存区,撤销修改回版本库一样的状态

2. 可能添加暂存区后 撤销修改回到添加暂存区后的状态

总之让他回到最后一次 git add git commit 状态

 

场景一 改乱了工作区的内容,想直接丢弃工作区

git checkout -- 文件名

 

场景二 假如你 git add

1.后用 git reset HEAD文件名 (HEAD表示最新版本)把暂存区修改回退到工作区(场景一)

2.再丢弃工作区的修改  git checkout -- 文件名(按场景一做)

 

场景三 假如你git commit 提交了

1. 版本回退(前提:没有远程推送)

3.删除文件

1. 确定要删除

git rm 文件名

git commit -m “文件被删除”

 

2. rm 文件 (删错了)

可以将误删的版本恢复到最新版本

git checkout --test.txt

checkout(就是用版本库的版本替换工作区的版本,无论工作区是修改还是删除都可以“一键还原”)

 

五.远程仓库

1.Github

本地Git Github 是通过SSH加密的)

1. 创建SSH Key 在主目录下.SSH文件夹下是否有id_rsa id_rsa.pub 文件,如果没有则创建。

$ ssh-keygen -t rsa -c “自己的邮件地址”

得到两个文件 id_rsa.pub 是公钥

 

             id_rsa 是私钥

2. 打开GitHub    Account setting ,  SSH Keys 页面

 Add SSH Keys 上添加Title ,在Key 文本框里粘贴 id_rsa.pub 内容

2.添加远程仓库

登录GitHub 在右上角Creat a new repo  ,创建一个新的仓库

Repository name 填入 learngit  点击Create repository 创建新的Git

本地的learngit 下输入 :

$ git remote add origin git@github.com:(你自己github的名字例:123lxy )/learngit.git

把本地库推送到远程:

$ git push -u origin master (将当前分支master推送到远程)

之后只要修改后 再提交 $ git remote origin master

 

第一次使用push 连接GitHub 时会出现SSH警告,之后就好了。

 

3.从远程库克隆

1.github上建一个新库:gitskills

2.勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个README.md文件。创建完毕后,可以看到README.md文件

3.现在远程库已经准备好,可以用git clone 克隆一个本地库:

$git clone git@github.com:123lxy/gitskills.git

进入gitskills目录里,已经有README.md文件了。

4. 如多人协作开发,每人克隆一份就可以了。

5. Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。 默认ssh

六.分支管理

1.合并与删除分支

例如:分支master  dev

1. 新建一个分支 $git branch dev

2. 切换分支 $git checkour dev

3. (1,2)可以合并为 $git checkout -b dev

4. 查看当前分支$git branch

*dev

branch  (会列出所有分支,在当前分支前有*)

5. 对文件做一些修改,然后提交。(当前分支为dev

6. 切换回master分支$git checkout master

7. master分支上可以看到对文件所做的修改不存在。

8. dev分支工作成果合并到master$git merge dev   merge命令用于将指定分支合并到当前分支

9. 合并后可以删除dev分支 $git branch -d dev

10. 删除后查看branch ,只剩下master分支了。

 

查看分支(本地) git branch    git branch -r(远程) git branch -a(本地和远程)

创建分支 git branch 分支名

删除分支(本地) git branch -d 分支名   

删除远程分支 

$ git push origin --delete [branch-name]

$ git branch -dr [remote/branch]

切换分支 git checkout 分支名

创建+切换 git checkout -b 分支名

分支合并到当前分支 git merge 分支名

 

2.解决冲突

新建一个分支feature1

f分支里将test.py 文件修改,提交

切回master分支,修改test.py,提交

 

使用merge  $git merge feature1 合并

快速合并发生冲突

进行修改后,保存再提交。


 

git 无法自动合并分支时,必须先解决冲突,再提交,合并完成

git log --graph 命令可以看到分支合并图。

 

 

3. 分支管理策略

fast foeward 模式,在删除分支后,会丢掉分支信息

禁用ff模式后,提交时会产生一个commit信息,这样从分支历史上可以查看出历史信息

 

1.新建一个dev分支,修改文件并提交。

2.切换回master分支

3.合并分支$git merge --no-ff -m”merge dev master”  dev

4.这样可以用 git log 查看历史  $git log --graph  --pretty=oneline   --abbrev-commit

 

3.1分支策略

开发过程中,每个人都有自己的分支,自己提交到dev分支中。版本发布时,再将dev提交到master


 

4. Bug分支

1.要创建一个新的分支修改一个bug ,但当前分支没有提交。

2.$git stash 将当前分支(dev)‘隐藏’起来,等恢复现场后继续工作。

3.确定要在哪个分支上修复,(当前在dev分支工作)假定在master分支上建立临时分支

 $git checkout master

 $git checkout -b issue-001

4. 现在修改bug,然后提交

5. 完成后切回mastermerge合并。$git merge --no-ff -m “merge in master” 

删除issue-001分支

6. 修复完bug,回到dev分支

7. 刚才工作现场‘隐藏’到哪去了。用$git stash list 还在,只是存在某个地方了

8. 两种恢复方法$git stash apply 但恢复后stash内容不删除,你可以用$git stash drop 删除

9. $git stash pop 恢复的同时把stash内容删除了

10. 你可以多次stash ,恢复时先用git stash list 查看,再恢复指定stash $git stash apply stash@{0}

11. 

 

5. Feature 分支

开发一个新功能,在feature-vulcan分支上

1. 新建$git checkout -b feature-vulcan  开发完后提交。切回dev,准备合并,删除

2. 突然改计划,销毁此分支

3. $git checkout -d feature-vulcan  Git提示失败,因为还没有合并,若删除将丢掉修改。

4. 强制删除$git branch -D feature-vulcan

6. 多人合作

查看远程库信息$git remote

$git remote -v   (可以看到详细的抓取和推送的origin地址)

$git remote remove 库名  (删除本地库)

6.1推送分支  

$git push -u 本地库(可选) 本地分支(可选)

例:$git push -u origin master

 master:主分支

 dev:工作分支

 bug:不用提交,在本地修改

 feature:是否提交取决于,是否和小伙伴合作在上面开发

6.2抓取分支

现在模拟一个新的电脑(注意要把SSH key添加到github中),或在同一个电脑的另一个目录克隆

$git clone git@github.com:123lxy/Desktop.git

默认情况下克隆后只能看到master分支

1. 现在要在新的dev分支上开发

创建$git checkout -b dev origin/dev

现在可以在dev分支上修改,提交,push

2. 其他人已经修改,将origin/dev 分支推送了提交,碰巧我也对文件做了修改,并试图push

失败了,因为冲突。

git pull 把最新的提交从origin/dev抓下来,然后在本地合并,解决冲突,再推送。

3. git pull失败了因为没有指定本地dev与远程origin/dev的链接

 $git branch --set-upstream dev origin/dev

 pull,成功了。

4. 但合并有冲突,需要手动解决和 六(2)解决冲突一致。

5. 解决后,提交,push

 

1.$git remote -v 查看远程库信息

2.本地推送git push origin branch-name ,失败就git pull抓取远程新提交

3.在本地创建和远程对应的的分支git checkout -b branch-name origin/branch-name(本地和远程名最好一致)

4.建立本地分支和远程分支的关联git branch --set-upstream branch-name origin/branch-name

5.从远程抓取分支用git pull ,若有冲突,先处理冲突

七.标签管理

1. 创建标签

git中 打标签很重要,首先切换到要打标签的分支

git branch

git checkout master

1.git tag  <name>打一个新标签

$git tag v1.0

git tag 查看所有标签

2. git tag默认为最新的commit打上标签,如何为以前的commit打上标签

$git log --pretty=oneline --abbrev-commit

显示出commit记录及对应Id

$git tag 标签 id号    例:git tag v0.1 456f665

查看git tag (标签不是按时间顺序排列,是按字母序排列)

git show tagname(查看标签信息)

3. 还可以创建带有说明的标签

git tag -a v1.0 -m “说明”

git show v1.0 查看说明文字

4. 通过-s用私钥用私钥签名一个标签

$git tag -s v2.0 -m “Second test”

签名采用PGP签名,首先必须按装GPG,若没有会报错

2.操作标签

1.如果标签打错了可以删除

$git tag -d v1.0

2.如果要推送某个标签到远程

$git push origin tagname

3.一次性推送所有尚未推送到远程的本地标签

$git push origin --tags

4.标签已经推送,要删除标签 先从本地删,然后删远程

$git tag -d v0.9

$git push origin :refs/tags/v0.9

八. 使用Github

1.Fork:进入其他github(例:bootstrap)项目主页,点fork,就在自己账号下克隆了一个库。

然后从自己账号下克隆

$git clone git@github.com:123lxy/bootstrap.git(库名)

2.一定要从自己的账号下克隆,这样才能修改

如果从bootstrap的作者的仓库地址git@github.com:twbs/bootstrap.git克隆,因为没有权限,你将不能推送修改

1. 如果想修改,可以在自己电脑上修盖,再push

2. 若想让官方库接收你的修改,在github上发起一个pull request

九.自定义Git

1. 颜色配置

Git显示颜色会让命令输入更加醒目

$git config --global color.ui true

2. 忽略特殊文件

有些文件不能被提交,在git根目录下建一个特殊的.gitignore,把要忽略的文件名填进去,git会自动忽略这些文件。

$touch .gitignnore

在文件内添加想要忽略的文件名,在将文件提交。

3. 配置别名

偷懒,以后敲git st 就表示git status

$git config --global alias.st status

$ git config --global alias.co checkout

$ git config --global alias.ci commit

$ git config --global alias.br branch

 

在撤销修改中,git reset HEAD file 可以把暂存区的修改撤销掉(unstage),重新放回工作区

git config --global alias.unstage ‘reset HEAD’

 

显示最后一次提交 $ git config --global alias.last ‘log -1’

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"

试一试,有惊喜

4. 配置文件

配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。

配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中

alias在文件中,可以直接删除对应的行

十.搭建Git服务器

假设已经有sudo权限的账号

1. 安装git$sudo apt-get install git

2. 创建一个git用户,来运行git服务 $git adduser git

3. 创建证书登录,收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里一行一个

4. 初始化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

5.禁用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每次一登录就自动退出。

管理公钥

如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。

管理权限

可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的。Gitolite就是这个工具


 





 

 

 

 


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值