分布式版本控制
集中式(SVN)需要从服务器获取完整版本,修改后还要提交给服务器。服务器崩溃,以前的历史信息会丢失,分布式本地有保存则不会丢失。
分布式每个用户都有完整版本,可以在本地保存修改,服务器只是交换用户的修改数据。(低版本Linux的可能不是git,还没改名考虑git-core)
配置全局用户
–global 所有的Git仓库都会使用这个配置
git config --global user.name "your name"
git config --global user.email "test@email.com"
创建版本库
版本库又称仓库,相当于目录,里面存放的文件被git管理,会记录修改的文件信息(修改人,修改时间,修改说明)。
创建目录
目录变仓库
git init
生成.git目录存放版本修改信息,不要手动修改,只记录纯文本的修改信息。文本使用utf-8编码。
要放到git仓库的文件必须在仓库下。
上传文件
先添加文件,可以多次add
git add 文件
提交文件
git commit -m "陈述修改信息"
查看仓库的当前状态
git status
查看文件的不同,可以查看修改的内容
git diff
add后的status,会变成change commit
快照(commit)
快照即提交的存档
查看记录存档
参数–pretty=oneline会将多条记录以一行一行的显示,只能查看当前版本之前的提交历史
git log
6a208c5c…的commit id,根据SHA1生成。
HEAD指向当前版本,HEAD^指向上一个版本,HEAD~100指向上100个版本
查看历史命令
可以查看未来的提交,即从未来版本回退到当前版本时,log是无法查看的
git reflog
版本穿梭
切换commit的版本,commit_id可以log或relog查看
git reset --hard commit_id
暂存区
add命名会把文件从工作区(git目录)存到暂存区,暂存区的文件通过commit命令提交给分支。HEAD指向分支。
git记录的是文件的修改,不add到暂存区的文件在commit时不会提交到分支。
撤销工作区的文件修改
git checkout -- 文件
撤销暂存区的文件修改,即在工作区add后撤销,然后可以再撤销工作区的文件修改(上一条命令)
git reset HEAD 文件
commit后要撤销参考版本穿梭
删除文件
工作区的文件删除,还要删除版本库中的文件,先git rm后还要git commit
git rm 文件
工作区的文件被误删时,可以通过版本库中文件还原修改或删除工作区的版本。
git checkout -- 文件
远程操作
配置ssh
ssh-keygen -t rsa -C "test@email.com"
输入命令后一路回车,在用户目录下会自动生成公钥和私钥,对应.ssh隐藏目录下id_rsa和id_rsa.pub
在github的账号ssh设置中,添加公钥
查看公钥
本地库与远程库关联
git remote add origin git@github.com:username/repository.git
本地库的master分支推送到远程库,首次推送需要加参数-u
git push -u origin master
从远程克隆
git clone git@github.com:用户名/仓库名.git
分支
git的分支是以时间线为基础的,HEAD指向master分支,分支指向当前文件版本。创建并使用新分支时,HEAD会指向新分支。但是并不会影响master分支的使用,可以将新分支与master分支合并,master直接指向新分支的版本。合并后可以删除新分支,就只剩master分支了。
具体理解见
https://www.liaoxuefeng.com/wiki/896043488029600/900003767775424
查看分支
git branch
创建分支
git branch branch_name
切换分支
git switch branch_name
创建并切换分支,两种都可以
git switch -c branch_name
git checkout -b branch_name
合并某分支到当前分支
git merge branch_name
删除分支
git branch -d branch_name
分支合并冲突
两个分支对同一个文件做了修改并提交时,不能直接合并两个分支,会发生冲突需要手动解决文件冲突再提交
<<<<<<<,=======,>>>>>>>标记出不同分支的内容
查看分支合并图
git log --graph
禁用Fast forward,会合并记录分支信息(???)
git merge --no-ff -m "merge with no-ff" dev
查看分支历史,–abbrev-commit 减少数据头部显示(commit_id)
git log --graph --pretty=oneline --abbrev-commit
一般不开发中不使用master分支,使用其他分支,在合并到master
bug分支
保存当前分支工作现场
当临时需要处理bug时,需要保存当前分支,再切换到master分支,创建一个修复bug的分支,在合并到master分支。
git stash
查看保存的工作现场
git stash list
恢复工作现场,先切换到工作分支
git stash apply #恢复,不会删除stash list记录
git stash pop #恢复同时删除stash
多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash
git stash apply stash@{0}
dev分支是从前面的master分支复制出来的,dev分支也存在bug不要重复提交和合并,直接在dev分支通过在master的提交就能更新。
git cherry-pick commit_id
Feature分支
在添加新功能时,创建feature分支,这个分支没有被合并时不能删除,强制删除-D,删除-d
git branch -D 分支名
多人协作
查看远程可以上传和下载的地址
git remote -v
推送分支到github,一般推送master和dev分支
git push origin 分支名
clone时默认只能看到master,需要关联dev,创建远程origin的dev分支到本地
git checkout -b dev origin/dev
两个人先后对同一个分支进行修改,后面提交的会引起冲突,git pull分支解决冲突后重新push
注意指定本地dev分支与远程origin/dev分支的链接,没链接可能会报错
git branch --set-upstream-to=origin/dev dev
查看远程库信息,使用
git remote -v
;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用git push origin branch-name
,如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name
;
从远程抓取分支,使用git pull
,如果有冲突,要先处理冲突。
log变直线
git rebase
标签
可以根据commit_id给文件打版本标签
用于新建一个标签,默认为HEAD,也可以指定一个commit id
git tag tagname [commit_id]
可以指定标签信息
git tag -a tagname -m "添加描述" [commit_id]
查看所有标签
git tag
删除本地标签
git tag -d v1.0
推送全部标签到远程
git push origin --tags
远程标签删除需要先删除本地,在删除远程
git push origin :refs/tags/v1.0
删除github远程库
git remote rm origin
指定远程库的名字,就可以直接使用远程库名代替默认的origin
git remote add 远程库名 git@gitee.com:liaoxuefeng/learngit.git
忽略特殊文件
.gitignore中可以设置设置忽略哪些特殊文件,!.gitignore表示不排除
强制跳过.gitignore
git add -f
找到上传文件的规则
git check-ignore -v a.class
给命令起别名
git config --global alias.unstage 'reset HEAD'
也可以在配置文件中配置alias选项
bash要求github登录
出现要求github登录,需要通过以下命名将远程连接更改为ssh方式
git remote set-url test git@github.com:用户名/远程仓库名.git
出现unrelated history错误
两个独立仓库提交到统一远程仓库出现的错误
使用以下命令时加参数–allow-unrelated-histories,可以合并两个独立启动仓库的历史
git pull test master --allow-unrelated-histories
删除github上的目录
先进到本地要删除的文件夹下
git rm -r --cached directory #删除
git commit -m 'modify: Delete directory' #提交备注
git push -u origin master #push上去才完事儿,要注意