Git学习
创建GIT
- --global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
- 查看已有的配置信息
git config --list
- 创建空目录
mkdir learngit cd learngit
- 将这个目录变成Git可以管理的仓库
git init
- 将文件放到Git仓库
git add readme.txt git commit -m "wrote a readme file"
掌握仓库当前的状态
- git status告诉你是否有文件被修改过
git status
- git diff可以查看修改内容,difference
git diff readme.txt
- 版本控制系统查看历史记录
git log
git log --pretty=oneline
- 记录你的每一次命令,以便确定要回到未来的哪个版本。
git reflog
时光鸡
- 返回上一个版本
git reset --hard HEAD^
- 返回指定版本
git reset --hard 1094a
- 撤销工作区的修改
git checkout -- readme.txt
如果git add到暂存区后,则需要以下
git reset HEAD readme.txt git checkout -- readme.txt
- 删除文件
确实需要删除
git rm test.txt git commit -m "remove test.txt"
误操作删除了原文件
git checkout -- test.txt
远程仓库
- 创建SSH Key,保持默认即可,并与github建立连接
ssh-keygen -t rsa -C "youremail@example.com"
x:\Users\xxx\.ssh目录下id_rsa(私钥)和id_rsa.pub(公钥)两个文件,以下建立连接
登陆GitHub>>“Account settings”>>“SSH Keys”>>Add SSH Key,Key文本框里粘贴id_rsa.pub文件的内容
- 创建远程仓库并与本地关联,michaelliao---GitHub账户名
登陆GitHub>>reate a new repo>>Repository name填入learngit
本地输入以下命令与远程端关联,michaelliao为用户自己的账户名;origin 为本地远程命名,如果用户不单是Github一个远程端,还有自己建立的远程端,则另外命名一个;learngit.git则是自己前面填写的learngit。
git remote add origin git@github.com:michaelliao/learngit.git
- 把本地库的所有内容推送到远程库上
git push -u origin master
以后需要本地提交用以下命令即可
git push origin master
- 第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:
'''
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
'''
- 从远程仓库克隆
登陆GitHub>>创建一个新的仓库>>勾选Initialize this repository with a README
在本地把远程仓库克隆过来
git clone git@github.com:michaelliao/gitskills.gi
分支管理
- 创建与合并
创建切换一个分支<name>:以下命令相当于两个命令git branch <name>和git checkout <name>
git checkout -b <name>
查看当前分支,标 * 的为当前分支
git branch
将文件放到当前分支中
git add readme.txt git commit -m "branch test"
<name>分支的工作完成,我们就可以切换回master分支:
git checkout master
把<name>分支的工作成果合并到现在的分支上:
git merge <name>
删除分支
git branch -d <name>
- 分支冲突
当同时修改同一个文件,并且内容不相同时,在分支合并时提示冲突
feature1分支合并时,Git告诉我们,readme.txt文件存在冲突,必须手动解决冲突后再提交
git merge feature1
'''
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
'''
GIT也可以告诉我们冲突的文件
git status
'''
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
'''
#查看冲突的文件,Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
'''
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
'''
#修改冲突的内容后再度提交
git add readme.txt
git commit -m "conflict fixed"
#用带参数的git log也可以看到分支的合并情况
git log --graph --pretty=oneline --abbrev-commit
#删除分支
git branch -d feature1
#分支策略
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了
#Bug分支
#Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
git stash
#确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支
git checkout master
git checkout -b issue-101
#修改完成提交并合并
git add readme.txt
git commit -m "fix bug 101"
git checkout master
git merge --no-ff -m "merged bug fix 101" issue-101
#“储藏”工作现场查看
git stash list
#工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
#1
git stash apply
git stash drop
#2
git stash pop
#dev是从master上分出来的,也即dev上也有同样的bug,以下是快速将bug解决方案应用到dev中
#Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支
git cherry-pick 4c805e2
#Feature分支
#新功能分支管理
git checkout -b feature-vulcan
git add vulcan.py
git status
git commit -m "add feature vulcan"
#切回dev,准备合并:
git checkout dev
#当新功能不需要时,由于这个包含机密资料的分支必须就地销毁:
git branch -d feature-vulcan
git branch -D feature-vulcan #-D强制删除
#多人协作
#查看远程库的信息
git remote
git remote -v
#推送分支,指定本地分支
git push origin master
#分支推送管理
但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
#标签管理
#Git的标签虽然是版本库的快照,但其实它就是指向某个commit id的指针,tag就是一个让人容易记住的有意义的名字
#切换到需要的标签页
git checkout dev
#设置标签,默认是打在最近一次commit上
git tag v1.0
#查看所有标签
git tag
#忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?方法是找到历史提交的commit id,然后打上就可以了
git log --pretty=oneline --abbrev-commit
git tag v0.9 <commit id>
#指定标签信息
git tag -a <tagname> -m "blablabla..."
#删除错误标签
git tag -d v0.1
#推送某个标签到远程
git push origin <tagname>
#一次性推送全部尚未推送到远程的本地标签:
git push origin --tags
#从远程删除。删除命令也是push,但是格式如下:
git push origin :refs/tags/<tagname>
#自定义Git
git config --global color.ui true
#忽略特殊文件
#在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
'''
忽略文件的原则是:
1.忽略操作系统自动生成的文件,比如缩略图等;
2.忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
3.忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件
'''
#如果你确实想添加该文件,可以用-f强制添加到Git
git add -f App.class
#或者你发现,可能是.gitignore写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore命令检查:
git check-ignore -v App.class
#配置别名
git config --global alias.st status
#配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
#搭建Git服务器,ubuntu
#第一步,安装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
#第五步,禁用shell登录:出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行
git:x:1001:1001:,,,:/home/git:/bin/bash -> git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
#第六步,克隆远程仓库:可以通过git clone命令克隆远程仓库了
git clone git@server:/srv/sample.git

浙公网安备 33010602011771号