zoukankan      html  css  js  c++  java
  • git 笔记

    git github gitosc

    git bash/git GUI
    git bash,git 在 Windows 下的命令行工具
    git GUI,git在 Windows 下的图形界面工具

    git简介:
    GIT是分布式的,每个开发人员本地都会有一个版本库,而不像svn只在服务器上有一个版本库,
    因而绝大多数操作都只需要访问本地文件和资源,不用连网,所以处理起来速度飞快,而且不受单点故障影响。
    相对于svn,git多了本地版本库:工作目录--本地版本库--远程版本库
    git和svn的另一个差别是,Git只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。
    git保存的是变化文件的一个快照,svn保存的是前后变化的差异数据。
    git与svn还有一个差异是git在版本库中多了一个暂存区,其中保存了下次要提交的文件快照。

    文件的三种状态:
    已修改(modified),已暂存(staged)和已提交(committed)
    已修改表示修改了某个文件,但还没有提交保存;
    已暂存表示把已修改的文件快照保存在了暂存区中;
    已提交表示把已修改的文件快照安全保存在本地版本库库中;

    全局配置:
    git config --global user.name "你的名字" #名字会出现在你的提交记录中
    git config --global user.email "你的Email" #Email也会出现在你的提交记录中,请尽量保持此Email和您的GitOSC的注册Email一致
    git config --global push.default simple #不带任何参数的git push,默认只推送当前分支,这叫做simple方式

    分支策略:
    首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
    干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
    你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

    Git提示:
    The authenticity of host 'git.oschina.net (180.97.163.93)' can't be established.(authenticity 真实性,established 确立)
    Permanently added 'git.oschina.net,180.97.163.93' (ECDSA) to the list of known hosts.(Permanently 永久地)
    Could not read from remote repository.
    Automatic merge failed; fix conflicts and then commit the result.(conflicts 冲突)

    使用github/gitosc:
    使用github/gitosc时,需要登录,如果是https方式只要输入密码即可,如果是ssh方式,则要生成公钥并添加到服务器上才可以连接。
    https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令
    ssh-keygen -t rsa -C "guodefu909@126.com" #生成公钥的命令,一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码
    github开源免费,非开源要收费,而gitosc无论开源非开源都不收费,但是有项目数量限制,但是1000个项目的限制也是相当宽松了

    多人协作的工作模式通常是这样:
    首先,可以试图用git push origin branch-name推送自己的修改;
    如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
    如果合并有冲突,则解决冲突,并在本地提交;
    没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
    如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。


    常用命令:

    #初始化
    mkdir learnGIT
    git init learnGIT #创建本地新的仓库
    git clone <远程仓库路径> <新建目录作为本地仓库> #克隆远程仓库到本地,默认的只会建立master分支

    cd learnGIT
    vi readme.txt #新建文件readme.txt

    #本地操作
    git status #查看工作区和暂存区当前的状态
    git add readme.txt #提交新文件到暂存区
    git add readme.txt #提交修改(包括删除)到暂存区(和提交新文件是一样的)
    #这是不同于svn的地方,修改如果没有提交到暂存区,commit时是不会将改动提交到当前分支的
    git add -A #暂存所有修改的、新增的和删除的文件
    git add . #暂存修改的、新增的和删除的文件,同git add -A
    git add -u #暂存修改的和删除的文件,不包括新增的文件
    git rm readme.txt #记录从跟踪清单中移除的操作到暂存区,并移除工作区文件
    git rm -r myFolder #记录从跟踪清单中移除的操作到暂存区,并移除工作区文件夹
    git rm --cached readme.txt #记录从跟踪清单中移除的操作到暂存区,但本地文件保留,例如日志文件,以便稍后在 .gitignore 文件中补上
    git commit -m "add readme.txt" #把文件提交到当前分支
    git commit -a #将工作区修改直接提交,跳过暂存区操作,但是新文件是不会被提交,不推荐使用
    git diff readme.txt #查看文件修改情况
    git diff #查看工作目录中当前文件和最新快照之间的差异
    git diff --cached #查看暂存区快照和上次提交快照之间的差异
    git diff --staged #同git diff --cached,1.6.1 及更高版本可用
    git log #查看历史记录
    git reflog #查看详细的历史记录
    git checkout -- readme.txt #撤销工作区修改,恢复到最新快照状态,注意是<checkout -->,注意区别于切换分支操作
    git checkout #撤销工作区修改,所有文件恢复到最新快照状态,不包括新增的untracked的文件
    git reset HEAD readme.txt #丢弃文件在暂存区的快照
    git reset HEAD #丢弃暂存区所有快照
    git reset --hard HEAD #撤销工作区所有修改,丢弃暂存区所有快照,不包括新增的untracked的文件
    #若要将新增的untracked的文件一并恢复,可先用git add .将所有文件都加入快照,再执行本命令
    git reset --mixed HEAD #丢弃暂存区所有快照,工作区不变
    git reset --soft <commit> #不改变暂存区和工作区文件,只是将HEAD指向<commit>
    git reset --hard HEAD^ #版本回退(HEAD^表示上一个版本,也可以用HEAD~1表示,还可以直接用commit id)

    #修改最后一次提交
    git commit -m 'initial commit'
    git add forgotten_file
    git commit --amend
    #上面的三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容。

    #远程操作(remote)
    git remote -v #查看远程库的详细信息
    git remote add origin <远程仓库路径> #添加远程仓库,origin是给这个远程仓库取的别名
    git remote rename origin osc #修改远程仓库别名
    git branch --set-upstream branch-name origin/branch-name #关联本地分支和远程分支
    git pull <远程主机名> <远程分支名>:<本地分支名> #自动抓取数据下来,然后将远端分支自动合并到本地仓库中分支
    #省略本地分支名则合并到当前分支;如果本地分支与远程分支之间已经建立追踪关系,则可以省略远程分支名;如果当前分支只有一个追踪分支,连远程主机名都可以省略;
    git fetch origin #从远程仓库抓取上次抓取以来别人提交的更新,不自动合并到当前工作分支
    git push <远程主机名> <本地分支名>:<远程分支名> #推送本地分支到远程分支
    #如果本地分支与远程分支同名,则可以省略远程分支名,git push origin master 表示推送master到origin的master;如果该远程分支不存在,则会被新建;如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略;省略本地分支名时,会根据设置的push.default来确定是推送所有分支到远程对应分支还是推送当前分支到远程对应分支;如果当前分支只有一个追踪分支,那么主机名都可以省略;
    git push origin :dev #推送一个空的本地分支到远程分支dev,表示删除指定的远程分支
    git push origin --delete dev #删除指定的远程分支
    git push -u origin master #将本地库的所有内容推送到远程仓库origin的master分支,-u参数把本地的master分支和远程的master分支关联起来
    git push --all origin #将本地的所有分支都推送到远程主机,不管是否存在对应的远程分支


    #分支操作(branch)
    git branch #查看本地分支
    git branch -r #查看远程分支
    git branch -a #查看所有分支,包括本地分支和远程分支
    git checkout master #切换分支master,这里checkout和svn中的明显不同
    git checkout -b dev #从当前分支创建并切换分支dev,-b参数表示创建分支
    git checkout -b dev origin/dev #从origin/dev分支创建并切换分支dev,origin/dev可以是本地分支也可以是远程分支
    git checkout -t origin/dev #该命令等同于:git checkout -b dev origin/dev
    git branch dev #创建dev分支
    git branch -d dev #删除dev分支
    git merge dev #将dev合并到当前分支
    git merge --no-ff -m "merge with no-ff" dev #--no-ff参数,表示禁用Fast forward,因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
    git status #git status也可以查看冲突的文件,编辑冲突文件后即可提交
    git log --graph #查看到分支合并图
    git branch --merged #查看哪些分支已被并入当前分支
    git branch --no-merged #显示还未合并进来的分支

    #存放区操作(stash)
    git stash #把当前工作现场“储藏”起来,等以后恢复现场后继续工作,可以多次
    git stash list #查看存放区列表
    git stash apply <> #恢复存放区,存放区内容并不删除
    git stash drop <> #删除存放区内容
    git stash clear #清空存放区
    git stash pop <> #恢复的同时把存放区内容也删了
    #对于修改的文件,会丢失暂存区快照,所有修改都当成工作区修改;
    #对于新增的文件,会将所有修改都放到暂存区,即使之前有部分内容没有暂存

    #标签操作(tag)
    git tag v1.0 #标签也是版本库的一个快照,跟分支很像。但是分支可以移动,标签不能移动
    git tag v0.9 6224937 #为历史版本打标签
    git tag -a v0.1 -m "version 0.1 released" 3628164 #带有说明的标签,用-a指定标签名,-m指定说明文字
    git tag #查看所有标签,标签不是按时间顺序列出,而是按字母排序的
    git show <tagname> #查看标签信息
    git tag -d v0.1 #删除标签
    git push origin <tagname> #推送某个标签到远程
    git push origin --tags #一次性推送全部尚未推送到远程的本地标签
    git push origin :refs/tags/v0.9 #删除远程标签

    #编写.gitignore文件,设置忽略某些文件
    *.a # 忽略所有 .a 结尾的文件
    !lib.a # 但 lib.a 除外
    /TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
    build/ # 忽略 build/ 目录下的所有文件
    doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
    doc/**/*.txt # 忽略 doc/ 目录下所有的txt文件

    #设置命令别名(alias)
    git config --global alias.st status #为status设置别名st
    git config --global alias.co checkout
    git config --global alias.ci commit
    git config --global alias.br branch
    git config --global alias.unstage 'reset HEAD'
    git config --global alias.last 'log -1 HEAD'
    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"

    如何对改动做细致对比,最好是图形界面的?
    gitk #基本上相当于 git log 命令的可视化版本
    git mergetool #调用一个可视化的合并工具并引导你解决所有冲突
    git config --global merge.tool tortoisemerge #配置合并工具


    如何将远程仓库中的多个分支复制到本地仓库?
    git clone <远程仓库路径> #克隆远程仓库到本地,默认的只会建立master分支
    git checkout -b dev origin/dev #从origin/dev分支创建并切换到dev分支,origin/dev可以是本地分支也可以是远程分支

    push.default is unset
    执行 git push 时看到如下消息:
    warning: push.default is unset; its implicit value is changing in
    Git 2.0 from 'matching' to 'simple'. To squelch this message
    and maintain the current behavior after the default changes, use:
    git config --global push.default matching
    To squelch this message and adopt the new behavior now, use:
    git config --global push.default simple
    Matching:
    ‘matching’ 参数是 Git 1.x 的默认行为,其意是如果你执行 git push 但没有指定分支,它将 push 所有你本地的分支到远程仓库中对应匹配的分支。
    Simple:
    而 Git 2.x 默认的是 simple,意味着执行 git push 没有指定分支时,只有当前分支会被 push 到你使用 git pull 获取的代码。
    修改默认设置:
    从上述消息提示中的解释,我们可以修改全局配置,使之不会每次 push 的时候都进行提示。对于 matching 输入如下命令即可:
    git config --global push.default matching
    而对于 simple ,请输入:
    git config --global push.default simple

    --amend(修改提交)和--rebase(衍合)不要随便用,如果对已经推送到远程仓库的内容进行amend或rebase会造成内容错乱,你提供了同样变更的不同版本

    使用git stash前,请注意先将新增文件纳入跟踪,即先git add <新增文件名>

  • 相关阅读:
    浏览器刷新缓存机制
    Asp.Net获取IP的方法
    c# 了解委托
    用什么方法来判断字符串是否存在的函数
    怎么样从地址中获得数据?
    新网站如何不被百度查封,请注意以下事项。
    搜索引擎如何抓取网页和如何索引网页?
    什么情况下include_path不起作用?
    用户注册演示程序操作案例
    用户提交的cookie提交时为什么传不到服务器
  • 原文地址:https://www.cnblogs.com/guodefu909/p/4874635.html
Copyright © 2011-2022 走看看