* git是版本控制工具
- 仓库
github
国外服务器, 国际知名度高, 私有仓库收费
参与他人项目
将他人的项目fork到自己的github中, 然后修改之后,通过request pull,看他人是否接受你的修改.
码云(gitee)
国内服务器, 快, 私有仓库免费, 容量有限
*
git搭建
-
安装
sudo pacman -S git -
自报家门
git config --global user.name “Your Name”
git config --global user.email “email@example.com” -
建立版本库
创建版本库目录,在当前目录下执行以下命令
git init
会生成.git目录 -
添加文件到版本库中
git add file1
git add file2 file3
git commit -m “注释”
时光穿梭机
-
更改文件
git status //查看工作区的状态,是否有更改
git diff //对比更改的地方 本地版本与暂存区比较
git diff HEAD //本地版本与master比较
git add file1
git commit -m “” -
版本回退
// 查看commit 日志
git log
//HEAD指向当前版本
//回退到上一个版本,
git reset --hard HEAD^
//回退到上上个版本
git reset --hard HEAD^^
//回退到上100个版本
git reset --hard HEAD~100
//回退到指定版本
git reset -hard commit_id
// 查看命令历史记录
git relog
-
工作区与暂存区
工作区 --> add --> 暂存区 --> commit --> master -
撤销修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD ,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交. git reset 版本号
场景4: 当你add文件后,想要撤销。git reset 文件名
-
删除文件
git rm file
git commit
远程仓库
- 两种方式
(1). SSH
速度更快
不用每次输入密码
本地仓库push到远程仓库
git remote add origin git@server-name:path/repo-name.git //origin是默认, 可以修改
git push -u origin master //第一次push加-u, 将本地与远程关联起来, 简化操作
git push origin master
远程仓库clone到本地仓库
git clone git@github.com:michaelliao/gitskills.git
删除远程仓库
git remote rm origin
(2). http
*
分支管理
git branch //查看分支
git branch //创建分支
git checkout //切换分支
git checkout -b //创建并切换分支
git merge //合并某分支到当前分支 默认使用fast forward 在日志中看不到曾经合并过
git branch -d //删除分支
-
解决冲突
在无法合并时,需先解决冲突,再提交,合并
git log --graph //分支合并图
git merge --no-ff -m “” //禁用fast forward 可以在日志中看出曾经做过日志 -
bug分支
在写程序时, 需要突然的修改一个bug, 使用stash保存当前未commit的环境,然后再切换分支去修改bug,修改后,切换分支,再使用stash pop将工作环境还原
git stash //将当前工作环境(未提交)保存
git stash apply //将工作环境还原, 但不删除stash
git stash pop //将工作环境还原,并删除stash
git stash list //查看工作环境列表
- feature分支
每次添加一个新功能时, 最好新建一个分支,完成新功能后, 再合并.
如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。
- 多人工作
git remote -v //查看远程库
git pull //将远程的代码合并到本地
git checkout -b branch-name origin/branch-name //将远程的分支同步到本地分支
git branch --set-upstream branch-name origin/branch-name //远程分支和本地分支相关联
多人工作的模式
-
首先,可以试图用git push origin 推送自己的修改;
-
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
-
如果合并有冲突,则解决冲突,并在本地提交;
-
没有冲突或者解决掉冲突后,再用git push origin 推送就能成功!
-
rebase
标签管理
git tag //给当前分支创建标签
git tag -a -m “blablabla…” //给当前标签指定标签信息
git tag //查看所有标签
git show tag_name //展示该tag信息
git tag tag_name 版本号 //给该版本添加tag名
git push origin //向远程推送一个tag
git push origin --tags //推送本地所有tag
git tag -d //删除本地tag
git push origin :refs/tags/ //删除远程tag
*
git自定义配置
git config --global color.ui true //添加颜色
-
忽略特殊文件
编写.gitignore文件, 将需要忽略的文件写入该文件中
example:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
模板:
https://github.com/github/gitignore -
如果发现有文件添加不上
git add -f App.class //强制添加
git check-ignore -v App.class //查看是哪个忽略规则出现问题 -
别名
git config --global alias.st status //git st
git config --global alias.unstage ‘reset HEAD’ //git unstage test.py == git reset HEAD test.py
//查看日志更详细
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”
-
配置文件
–global 针对该用户, 配置文件在/home/jim/.gitconfig
针对该项目的配置文件在 .git/config -
搭建git服务器
(1). 安装git
pacman -S git
(2). 创建git用户
adduser git
(3). 证书
将公钥导入到/home/git/.ssh/authorized_keys中, 一行一个
(4). 初始化git仓库
git init --bare sample.git
chown -R git:git sample.git
(5). git用户不允许登录shell
/etc/passwd
git❌1001:1001:,:/home/git:/bin/bash 改为
git❌1001:1001:,:/home/git:/usr/bin/git-shell
(6). 克隆远程仓库
git clone git@server:/srv/sample.git
(7). 管理公钥
Gitosi
(8). 权限管理
Gitolite