说明:
从主观使用角度对git命令做了一个整理,适合回顾查找,不适合入门使用
0、用户配置
1、安装完git后,表明本机器全局git 用户,用如下命令
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
2、在当前目录创建git 版本库 会生成 .git目录,内部有stage(暂存区)和 当前分支
git init
3、让Git显示颜色,会让命令输出看起来更醒目
git config --global color.ui true
1、版本更新
- 把文件添加到暂存区
git add filename
- 查询当前工作区文件与版本库是否有差别 ,或暂存区即待提交(commit)文件
git status
输出如下:
Changes to be committed: //表示已经add 的文件(暂存区)
Changes not staged for commit:
modified: filename // 表示已经修改,但未add 的文件
git diff filename // 查看工作区某文件与版本库(分支)的 差别,若暂存区有该文件,比较的就是工作区与暂存区的差别
git reset HEAD filename // 从暂存区 撤销到工作区
git commit -m" 本次提交说明 " // 把暂存区文件提交到当前分支
注意:每次修改,如果不add到暂存区,那就不会加入到commit中
2、版本回退
git log // 查看 版本库 版本记录即 commit记录
git log --pretty=oneline // 简略显示 版本历史
git reset --hard HEAD^ //作用 返回到上一版本 在Git中,用HEAD表示当前版本,
git reset --hard commit_id(版本号)(前几位即可) //上一个版本就是HEAD^,上上一个版本就是HEAD^^,往上100个版本HEAD~100
git reflog // 查看历史命令 含 各个版本的id
git checkout --filename //撤回文件修改 若暂存区有该文件从暂存区返回,否则从版本分支返回
3、删除
git rm filename 从本地及版本库删除 (commit 生效)
git reset HEAD tet.txt 从暂存区撤销文件tet的删除命令
4、关联远程库,
使用命令 :
git remote add origin git@server-name:path/repo-name.git
第一次推送 :
git push -u origin master //第一次推送master分支的所有内容到远程库
以后的推送 :
git push origin master // 推送最新修改,到master分支
查看远程库信息,使用git remote -v
5、分支
Git鼓励大量使用分支:
创建分支:
git branch <name>
切换分支:
git checkout <name>
创建+切换分支:
git checkout -b <name>
查看分支:
git branch
合并某分支到当前分支:
git merge <name>
删除分支:git branch -d <name>
强行删除 git branch -D <name> //丢弃一个没有被合并过的分支
6、合并分支冲突
当前分支 master , 合并分支 dev
git merge dev 出现conflict后 显示如下信息,说明合并成功,但存在冲突行
CONFLICT (content): Merge conflict in filename
Automatic merge failed; fix conflicts and then commit the result.
[root@bogon GitLearning]# git status
a) 显示冲突文件 git status
b) 进行修改 vim 冲突文件
c) 正常提交 git add xxx ---> git commit -m" conflict fixed "
注意:此次修改 只改动合并后的冲突分支 即master。 原dev分支 内容不变
7、注意Fast forward模式merge
Fast forward模式merge成功后记录里没有此次和并记录,不合理,所以可以禁用Fast forward 模式的merge。Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息
git merge --no-ff -m "merge with no-ff" dev // 因为有新commit 所以加上-m
合并后,我们用git log看看图表分支历史:
$ git log --graph --pretty=oneline --abbrev-commit
8、bug分支
git stash: 当手头工作没有完成时,先把当前分支工作现场git stash一下,然后去新开分支修复bug,修复后,再回原分支git stash pop,回到工作现场
1、git stash :把当前分支工作台和暂存区 贮存。空出工作台暂存区去进行其他紧急修复,
2、 $ git checkout master
$ git checkout -b issue-101
//去文件里修bug
$ git add README.md
$ git commit -m "fix-issue-101"
3、 $ git checkout master
git merge --no-ff -m "m-merge-issue-101" issue-101
git branch -d issue-101
4、 $ git checkout dev
5、 $ git stash list // 查看存储起来的工作现场
stash@{0}: WIP on dev: 6224937 add merge
6、 $ git stash pop // 恢复之前的工作现场
另外:你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
$ git stash apply stash@{0}
9、远程库某个分支
git checkout -b dev origin/dev // 在本地创建远程库origin的某个分支
10、推送拉取分支
git push origin branch_name 推送到远程分支。推送失败时,说明有文件冲突,需要先拉取回来,在本地合并后再push
git pull origin branch_name 从远程分支拉取,会出现合并冲突,解决冲突后 commit, 再 push
11、标签 – 针对某一库状态id 打标签
$ git tag <name> // 当前分支打标签
$ git tag <name> commitid // 针对某id 打标签
$ git show <tagname> // 查看标签详细信息
$ git tag // 列出所有tag
$ git tag -a v0.1 -m "version 0.1 released" <commitid> // 带有说明的标签,用-a指定标签名,-m指定说明文字
$ git tag -s <tagname> -m "blablabla..." // 可以用PGP签名标签
$ git tag -d v0.1 // delete tag
$ git push origin <tagname> // 推送某个标签到远程
$ git push origin --tags // 一次性推送全部尚未推送到远程的本地标签
删除远程标签需先从本地删除
$ git tag -d v0.9
然后
$ git push origin :refs/tags/v0.9
12、.gitignore 忽略名单
加入其中的文件格式都将被忽略 即不被track
git check --ignore 检查.gitignore中错误
例:
$ git check-ignore -v App.class
.gitignore:3:*.class App.class
13、简化命令 —> 别名
$ git config --global alias.st status
...等等等...
把log 配置成彩色
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"
14、配置文件
配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
配置文件放哪了?
每个仓库的Git配置文件都放在.git/config文件中
而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中
15、多人协作常规流程 :
因此,多人协作的工作模式通常是这样:
首先,可以试图用git push origin branch-name推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令
git branch --set-upstream branch-name origin/branch-name。
16、搭建centos git服务器
搭建git server:
虚拟机环境:centos 7
git server ip:192.168.206.134
git client ip:192.168.206.139
git server:
yum -y install git #安装git
useradd git -m #创建用户
mkdir -p /home/git/.ssh #创建存放公钥的目录
touch /home/git/.ssh/authorized_keys #创建存放公钥的文件
把客户端文件/root/.ssh/id_rsa.pub的内容复制到服务端/home/git/.ssh/authorized_keys文件下
mkdir -p /srv/sample.git #创建git仓库目录
cd /srv #切换到目录
git init --bare sample.git #初始化git仓库
chown -R git:git sample.git #更改目录的所属用户和所属组
vi /etc/passwd #修改/etc/passwd文件中git用户的登录shell为/usr/bin/git-shell
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
git client:
git remote add service git@192.168.206.134:/srv/sample.git #关联git服务器,service可以自定义,/srv/sample.git为创建的git仓库路径
git push -u service master #把本地master分支push到git server上
git clone git@192.168.206.134:/srv/sample.git #从git server上clone到本地
FAQ:git server的/srv/sample.git/refs/heads目录下存储着从本地push来的分支文件,看来一下是加密的