一、Git概述
Git是一个开源免费的分布式版本控制系统,Git的安装包和源码都可以在Git官网下载,Git官方推荐书籍https://git-scm.com/book/zh/v2,Git参考手册https://git-scm.com/docs。相对于其它版本控制系统,Git有如下特点:
1.开源免费: Git是根据GNU通用公共许可证版本2.0发布的,该版本是一个 开放源代码许可证,Git通过使用GPLv2来确保该软件对其所有用户都是开源免费的。
2.方便的分支模型: 使用Git可以方便快速地拉出独立的分支进行开发和尝试,而且分支可以回合到主线。
3.分布式: Git在本地就是一个完整的代码仓,几乎所有的操作都是在本地进行。Git分布式的特点使得它小而快,不需要联网也可以提交代码,GIt没有误删代码仓的风险,因为每一个本地的Git仓都相当于是一个备份。
二、Git配置
1.配置文件
优先级: 系统配置system < 全局配置global < 仓库配置local
git config --system # /etc/gitconfig 或者 git安装目录\Git\etc\gitconfig
git config --global # ~/.gitconfig
git config --local # .git/config
git config -l # 查看所有配置
git config --system -l # 查看系统配置
git config --global -l # 查看全局配置
git config --local -l # 查看仓库配置
2.基本配置
git config --global user.name your_name # 用户名
git config --global user.email your_email@example.com # 用户邮箱
git config --global core.ignorecase false # windows下大小写敏感
git lfs install # lfs配置
ssh-keygen -t rsa -C "your_email@example.com" # 生成公私钥对,建议默认路径、不设密码就行
# -t 指定密钥类型,默认是 rsa ,可以省略
# -C 设置注释文字,比如邮箱
# -f 指定密钥文件存储文件名
# 注意:ssh-key是配对使用,私钥 ~/.ssh/id_rsa放在本地,
# 公钥 ~/.ssh/id_rsa.pub拷贝到服务器或代码仓托管平台上
3.个性化配置
git config --global pull.rebase false # 默认false: pull=fetch+merge,true: pull=fetch+rebase
git config –-global core.editor vim # 配置编辑器,默认为vim
git config --global --unset user.name # 删除用户名配置
三、获取仓库
1.初始化仓库
git init # 将当前目录初始化为一个git仓,本质是创建了一个.git文件夹
git init --bare CI.git # 创建一个名为CI的裸仓库(只有仓库文件没有工作区)
2.克隆仓库
git clone https://github.com/git/git.git git_source # 克隆仓库,默认只在本地创建和检出主线master,可用-b指定为其它分支
git clone ./git_source/.git --bare # 克隆裸仓库
git svn clone svn_url # svn仓迁移到git
git remote -v # 查看关联的仓库,本地克隆的仓库默认关联了克隆的源仓库,关联名origin
git remote add origin2 git_url # 添加关联其它仓库
git remote remove origin2 # 删除关联
四、修改代码
1.工作区
git status # 查看仓库状态
# deleted: 删掉的文件
# modifide: 修改的文件
# untracked files: 新增的文件,还不在仓库控制范围内,只能用add添加到暂存区
git stash [save "message"] # 隐藏当前工作区,不包括新增的不在仓库控制范围内的文件
git stash list # 查看所有的stash
git stash apply # 恢复工作区,不删除stash
git stash drop # 恢复工作区,删除stash
git stash pop stash@{number} # 恢复工作区,并删除对应的stash
git stash clear # 删除所有stash
2.分支管理
git branch # 查看本地分支
git branch -a # 查看所有分支
git branch branch1 # 从当前分支拉出分支
git checkout branch1 # 切换分支
git checkout -b name # 从当前分支拉出分支并切换到该分支
git merge branch1 # 将branch1分支合入到当前分支,产生新的commit节点,原来的不变
git rebase branch1 # 将branch1分支合入到当前分支,不产生新的commit节点,原来的改变
git branch -d branch1 # 删除分支
git branch -D branch1 # 强制删除分支
git checkout -- xx # 撤销xx文件的修改
git checkout -- # 撤销所有文件的修改
3.回退版本
git reset --soft # 差异保存到暂存区
git reset --mixed # 差异保存到工作区
git reset --hard # 差异不保存
git reset --hard # 相当于git reset --hard HEAD,回退到当前的版本,HEAD为当前版本的指针
git reset --hard HEAD~ # 回退一个版本
git reset --hard HEAD~100 # 回退100个版本
git clean -xfd # 清除工作区不在仓库控制范围内的文件
五、提交代码
1.本地提交
# (1)从工作区添加到暂存区
git add xx # 添加xx文件
git add . # 添加当前目录下所有文件
git add -A # 添加所有文件
git add -u # 除了新增的不在仓库控制范围内的文件
# (2)从暂存区提交到仓库
git commit -m "first commit"commit_message
git commit -F ~/commit_message
git commit --amend # 修改最近一次提交的commit_message
2.更新代码
git fetch origin # 拉取远端仓库origin的所有分支到本地
git fetch origin branch1 # 拉取远端仓库origin的branch1分支到本地
git fetch origin branch1:branch1 # 拉取远端仓库origin的branch1分支到本地,并在本地创建对应分支
git merge origin/branch1 # 将远端分支合入到当前分支,产生新的commit节点,原来的不变
git rebase origin/branch1 # 将远端分支合入到当前分支,不产生新的commit节点,原来的改变
# 如果修改了同一个文件,合代码时会报冲突,比如冲突文件:
11111
<<<<<<< HEAD
22222
=======
33333
>>>>>>> branch1
# merge: 如果两边都有新的提交,当前的commit和要合入的commit都不变,创建新的commit合并两边代码,若有冲突冲突的文件保存到工作区,
# 解决完冲突删除标记冲突的符号再提交即可
# rebase: 如果两边都有新的提交,要合入的commit不变直接合入,当前的commit改变,与合入的代码共同生成一个新的commit,若有冲突
# 冲突文件保存在工作区,解决完冲突删除标记冲突的符号再提交或者:
git rebase --continue # 解决完冲突继续合并
git rebase --abort # 取消合并
3.推送到远端
git push origin master # 将本地仓库的master分支推送到远端仓库origin的对应分支
git push -f origin master # 强制推送,用本地仓库覆盖远端仓库,包括历史commit
git push origin master:master # 将本地仓库master分支推送到远端仓库origin的master分支
六、其它
1.查看历史
git log # 查看所有提交记录
git reflog # 查看所有操作记录
git show commit_id --stat # 查看某一次提交修改了哪些文件
git diff xx
git diff commit_id
git diff commit_id1 commit_id2
2.更新和推送
git pull origin branch1:branch2 # 将远端的branch1分支更新到本地branch2分支
git push origiin branch1:branch2 # 将本地branch1分支推送到远端branch2分支
git push origin master # 如果只指定一端的分支则另一端是对应的分支
git pull origin master # 默认配置pull.rebase=false: git pull = git fetch + git merge
git pull origin master --rebase # 加参数或配置pull.rebase=true: git pull = git fetch + git rebase
3.patch
git diff commit1 commit2 > 1.patch
git apply --reject 1.patch
git format-patch 1.patch
git am *.patch
4.多仓管理
repo参考博客: Repo介绍
5.其它
1.解决git bash中文乱码问题
git config --global core.quotepath false
git bash的Text设置为 zh_CN UTF-8
2.git仓接受推送
git config receive.denyCurrentBranch ignore