学习记录-Git

206 阅读9分钟

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