持续更新中。。。
一.安装及使用(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 “所做修改的备注”
(1)Git status告诉文件被修改过
(2)Git 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版本库是分两步:
1,git add 将文件添加进去就是 将文件添加到暂存区
2,git 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. 完成后切回master,merge合并。$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就是这个工具
1万+

被折叠的 条评论
为什么被折叠?



