git基础
创建远程仓库
-
ssh-keygen -t rsa -C "zaki@163.com" 拷贝到github,本地执行测试: ssh -T git@github.com 然后输入yes(必须)
-
git remote add origin git@github.com:zakiChina/learningnotes.git :本地添加远程源
-
git remote rm origin :删除远程分支
-
git pull origin master :从远程仓库拉取分支源码 如果远程仓库修改了文件,需要来合并分支:git pull origin master --allow-unrelated-histories
-
或者出现The following untracked working tree files would be overwritten by merge::git clean -d -fx ""
-
git push -u origin master : 提交分支代码到远程仓库
从远程仓库克隆
-
git clone git@github.com:zakiChina/learningnotes.git ##使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。
-
Permission denied (publickey). fatal: Could not read from remote repository.
1、未添加公钥; 2、未添加私钥: ssh-agent bash ssh-add ~/.ssh/id_rsa
git指令
-
git init :初始化本地仓库
-
git add filename : 将修改的文件添加到staged
-
git commit -m "xxx" : 提交修改到仓库,只提交当前staged的修改
-
git diff
-
git status
-
git log --pretty=oneline :日志只在一行显示
-
git reflog : 显示所有的执行命令
-
git checkout -- filename : 如果修改未add到staged,可以撤销修改
-
git reset HEAD filename : 如果修改提交到staged但未提交到仓库,可以更新staged的目录树,再通过 git checkout -- filename 撤销修改
-
git reset --hard HEAD^ : 分支版本回退
-
rm filename 删除文件
-
git rm -f filename 从版本库中删除文件
-
git pull --rebase origin master 从github上拉取文件
分支管理
-
HEAD指向master(当前分支流),master才指向提交
-
git checkout -b dev : 创建一个dev分支并切换,等于 git branch dev 和 git checkout dev
-
git branch : 查看当前所在分区
-
git merge dev :将分支dev合并到当前分支,一般覆盖
-
git branch -d dev :合并之后就可以删除分支了
解决冲突
-
git log --graph --pretty=oneline --abbrev-commit : 查看分支的合并情况
-
发生冲突后需要手动修改文件
分支管理策略
-
合并分支时,git会用fast forward模式,删除分之后会丢掉分支信息. --no-ff git会在merge时生成一个新的commit,可以从分支历史中看出分支信息
-
分支管理原则
- master必须是非常稳定的,仅用来发布新版本,平时不能在上面干活
- 干活都在分支dev上,知道某个时候合并到master上。
- 每个开发者都在分支dev上干活,每个人都有自己的分支,时不时往dev上合并就行了
BUG分支
-
每个bug都可以通过一个新的临时分支来修复,修复后合并分支,再删除临时分支
-
stash 将当前工作做现场储藏起来,等以后恢复现场继续工作(一般是在工作还未完成无法提交)
-
git stash 查看工作区
-
git checkout -b issue-101
-
git stash list
-
git stash apply 恢复现场,git stath drop 删除现场 git stash pop 恢复的同时删除现场
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除。
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。
Feature 分支
添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
- git checkout -b feature-vulcan
- git branch -d feature-vulcan 销毁失败。Git友情提醒,feature-vulcan分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用命令git branch -D feature-vulcan。
- git branch -D feature-vulcan
多人协作
-
git remote 查看远程库信息
-
git remote -v 查看详细信息
-
git push origin master 把分支上所有的本地提交推送到远程库,是否推送,看心情咯!
-
git pull origin master 把新的提交抓取到本地,在本地合并,解决冲突,再推送
-
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。这就是多人协作的工作模式,一旦熟悉了,就非常简单。
标签管理
发布一个版本时,我们通常先在版本库中打一个标签,这样,就唯一确定了打标签时刻的版本。标签也是版本库的一个快照。
Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。
-
git tag tagname
-
git tag 查看所有标签,按照字母排序
-
git tag tagname commitid 对某次提交打标签
-
git show tagname 查看具体某个标签的信息
-
git tag -a v0.2 -m "" commitid 创建带有说明的标签 -a指定标签名,-m指定说明文字
-
git tag -s v0.2 -m "" commitid -s用私钥签名一个标签,采用PGP签名。因此,必须首先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错
-
git tag -d tagname 删除标签。创建的标签只会存储在本地,不会推送到远程
-
git push origin tagname
-
git push origin --tags 推送一个或者所有tag
-
删除远程标签:git tag -d tagname 首先删除本地tag,git push origin :refs/tags/tagname 然后从远程删除
忽略特殊文件
- .gitignore
配置别名
- git config --global alias.st status
- git config --global alias.co checkout
- git config --global alias.ci commit
- git config --global alias.br branch
- 很多人都用co表示checkout,ci表示commit,br表示branch
- git config --global alias.unstage 'reset HEAD' 在撤销修改一节中,我们知道,命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区。既然是一个unstage操作,就可以配置一个unstage别名
- 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"
git 命令集合
linux 命令
- mkdir test (创建文件夹test)
- cd test (切换到test目录)
- touch a.md (新建a.md文件)
git命令 任何操作都需要以 git 命令为开头 本地操作:
-
git init 初始化一个本地仓库 新建为 master主分支
-
git status 查看当前分支状态
-
git add <文件名> 将文件更改添加到分支状态中 相当于文件等待被提交
-
git commit -m <"描述信息"> 提交并添加描述信息
-
git branch 查看分支 前面带*号的为当前所在分支
-
git branch <分支名称> 新建分支
-
git checkout <分支名> 切换分支
-
git checkout -b <分支名> 新建分支并切换到此分支
-
git merge <分支名> 将指定分支名合并到当前分支 一般为切换到主分支使用此命令
-
git merge --no-ff -m "提交描述" <分支名> 合并分支并提交
-
git branch -d <分支名> 有新建分支,那肯定有删除分支,假如这个分支新建错了,或者a分支的代码已经顺利合并到 master 分支来了,那么a分支没用了,需要删除,这个时候执行 git branch -d a 就可以把a分支删除了
-
git branch -D <分支名> 强制删除分支,不管分支是否有未提交合并的代码
-
git tag 查看所有标签 git tag <标签名> 在当前状态下新建一个标签,可用来当作版本号使用
-
git tag -a <标签名称> -m <"标签描述"> <提交id> 在指定的提交状态下新建一个标签
-
git show <标签名称> 查看标签的详情
-
git tag -d <标签名> 删除标签
-
git push origin <标签名> 推送标签到远程仓库
-
git push origin --tags 推送所有未推送的标签
-
git push origin :refs/tags/<标签名> 删除远程标签,本地要先删除后才可以
-
git checkout <标签名> 切换到标签名指定的状态 git diff <文件名> 查看文件修改内容
-
git log 查看提交日志 --pretty=oneline 此参数减少输出信息 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
-
git reflog 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
-
git log --graph --pretty=oneline --abbrev-commit 查看分支合并图
-
git reset --hard <HEAD^||提交ID> 穿梭到指定提交版本 HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
-
git checkout -- <文件名> 将指定的文件恢复到最近一次 commit或add操作时候的状态
-
git reset HEAD <文件名> 将指定的文件从暂存区的修改撤销掉(unstage),重新放回工作区 git rm <文件名> 删除指定的文件
-
git stash 把当前工作现场“储藏”起来,等以后恢复现场后继续工作
-
git stash list 查看暂存状态
-
git stash apply 恢复暂存状态
-
git stash drop 删除暂存状态
-
git stash pop 恢复并删除暂存状态
-
git stash apply <stash@{0}> 恢复指定的暂存状态
远征仓库操作:
-
git clone <远程地址> 从远征仓库拷贝过来代码,相当于建立本地分支
-
git pull 将最新的提交从远程仓库抓取下来
-
git push 将本地修改后的代码提交到远程仓库
-
git push <远程仓库名,默认origin> <本地分支名> 将指定的分支推送到远程分支上
-
git remote -v 查看远程仓库 -v 为详细信息
-
git checkout -b <本地支分支名> <远程仓库名,默认origin>/<远程支分支名> 拉取远程主分支下的支分支。。。
-
git branch --set-upstream <本地支分支名> <远程仓库名,默认origin>/<远程支分支名> 将本地分支与远程指定的分支关联起来
//以下为先有本地库,再建立远程库操作所用的命令
- git remote add origin <URL地址> 本地库与远征库关联
- git push -u origin master 关联后,使用命令第一次推送master分支的所有内容, -u参数为推送当前分支所有内容
- 删除远程参数文件
git rm --cached filename/-r directory
git commit -m "xxxx"
git push