• git


    Git介绍

    Git(the stupid content tracker)是一个源自Linux内核项目的源码管理工具。和传统的CVS、SVN不同,git是一个分布式源码管理工具。

    Git命令

    简单说明

    git init

    初始化一个本地的代码仓库。

    git clone

    从远程复制一个代码仓库。

    git config

    git选项设置。

    git add

    添加文件/目录。

    git commit

    提交修改。

    git status

    显示工作目录的状态以及缓冲区内的快照。

    git log

    已提交快照的日志。

    git branch

    创建分支。

    git checkout

    迁出/拉出/切换到一个分支。

    git merge

    合并分支。

    git revert

    撤销commit快照。

    git reset

    撤销本地工作目录的修改。

    git clean

    删除代码仓库以外的文件。

    git remote

    管理远程git。

    git fetch

    从远程获取分支。

    git pull

    从远程获取分支。

    git push

    把代码推到远程分支。

    基本概念

    文件状态

    Git仓库中的文件有几种状态:

    • untracked - 还没添加到仓库中。
    • unmodified - 自上次提交以来,文件未曾修改过。
    • modified - 文件修改了还没提交。
    • staged - 文件提交到了暂存区中。一旦执行git commit就会转换为unmodified状态。

    Git暂存区(Staged Area)的意思是:你把一个文件托付给Git跟踪(git add),然后又修改了它,此时这个文件就位于暂存区了。暂存区内的文件几乎只做一件事:等待你执行git commit,把它提交。

    快照(snapshot)

    Git与其他版本控制系统的区别在于:Git只关心文件是否变化,而不关心文件内容的变化。大多数版本控制系统都会忠实地记录版本间的文件差异(diff),但Git不关心这些具体差异(哪一行有什么变动),Git只关心哪些文件修改了哪些没有修改,修改了的文件直接复制形成新的blob(这就是所谓的快照snapshot)。当你需要切换到或拉出一个分支时,Git就直接加载当时的文件快照即可,这就是Git快的原因。说起来,这也是用空间换取时间的经典案例。

    从这个角度看,Git更像是一个小型文件系统,并在这个系统上提供一系列的工具来辅助开发。

    Git的地理观

    Git是一个分布式的版本控制系统,因此没有所谓的中心。粗略来看Git可分为本地库(local repository)和远程库(remote repository),细致地看可分为以下几个部分:

    • Working Directory - 工作目录。Git仓库位于工作目录之下,工作目录下的文件有加入Git仓库(tracked)和没加入Git仓库(untracked)的区别。
    • Stage Area - 暂存区。如上所述,已加入Git仓库并被修改(尚未提交)的文件。
    • Local Repository - 本地仓库。
    • Remote Repository - 远程仓库。

    文件通常是:加入Git仓库(git add)-> 修改后即位于暂存区 -> 提交到本地库(git commit) -> 推送到远程库(git push)。

    origin/master

    这里主要笔记一些在Git上下文中经常遇见的术语。origin/master指远程仓库origin的master分支。

    远程仓库/分支

    这样的形式。虽然Git是分布式的系统,但通常把git clone的源头叫做origin,origin也被视为中心仓库(Central Repository)。

    git入门

    创建目录,并用git init初始化:

    $ mkdir learn-git && cd learn-git

    $ git initInitialized empty Git repository in /tmp/learn-git/.git/

    git init输出可知,git创建了一个名为.git的隐藏目录。

    创建一个文件,并用git add添加到仓库,用git commit提交:

    $ echo "hello git" > README.txt

    $ git add .

    $ git commit -m "readme file"[master (root-commit) cd27ac1] readme file

     1 file changed, 1 insertion(+)

     create mode 100644 README.txt

    接下来对已提交文件做一些修改,并新添加一个文件:

    $ echo "learn files here" >> README.txt

    $ cp ~/.vimrc .

    git diff查看文件差异(每次commit前应该先diff对比差异详情):

    $ git diff

    diff --git a/README.txt b/README.txt

    index 8d0e412..0219596 100644--- a/README.txt+++ b/README.txt@@ -1 +1,2 @@

     hello git+learn files here

    差异对比可以用git diff --cached保存下来(如此差异则不输出到屏幕)。

    git status查看git仓库状态:

    $ git status# On branch master# Changes not staged for commit:#   (use "git add <file>..." to update what will be committed)#   (use "git checkout -- <file>..." to discard changes in working directory)##       modified:   README.txt## Untracked files:#   (use "git add <file>..." to include in what will be committed)##       .vimrcno changes added to commit (use "git add" and/or "git commit -a")

    这里显示README.txt被修改了,而.vimrc则等待添加。接下来,我们将.vimrc添加到git仓库中,且将所有修改一并提交(git commit -a):

    $ git commit -a -m "update readme && add vimrc"[master f6162f0] update readme && add vimrc

     2 files changed, 123 insertions(+)

     create mode 100755 .vimrc

    git log输出git日志,包括提交编号(如"f6162f04170e3665bc03744e43f764c903e4e38d"这样的字串)、提交者、提交日期和提交日志。

    git log的其他输出:

    $ git log -p                    # 详细日志,并输出到分页程序

    $ git log --stat --summary

    美化git log输出

    $ git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --

    修改全局配置:

    $ 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 lg

    管理分支

    创建一个分支:

    $ git branch exp

    查看当前git仓库的所有分支:

    $ git branch

      exp* master

    切换到exp分支:

    $ git checkout expSwitched to branch 'exp'

    修改文件,并提交:

    $ echo "start branch: exp" >> README.txt

    $ git commit -a -m "modified readme in exp branch"[exp 2e825a4] modified readme in exp branch

     1 file changed, 1 insertion(+)

    切换回master分支:

    $ git checkout masterSwitched to branch 'master'

    master分支检查文件,可见exp分支的修改并没影响到master分支(注意,在exp分支的修改都已提交;如果没有提交,则切换回master分支会看到文件已变)。接下来我们制造一个冲突:

    $ echo "return branch: master" >> README.txt                    

    $ git commit -a -m "modified readme in master branch"[master 8dd9fb2] modified readme in master branch

     1 file changed, 1 insertion(+)

    git merge exp合并分支:

    $ git merge expAuto-merging README.txt

    CONFLICT (content): Merge conflict in README.txtAutomatic merge failed; fix conflicts and then commit the result.

    git输出可见,git尝试自动合并但失败了,因此提示需要解决冲突再提交

    git diff查看差异,且差异文件被修改:

    $ git diff...

    $ cat README.txt

    hello git

    learn files here<<<<<<< HEADreturn branch: master=======

    start branch: exp>>>>>>> exp

    手工解决冲突并再次提交:

    (edit file)

    $ git commit -a -m "do merge"

    接下来,可以删除exp分支:

    $ git branch -d expDeleted branch exp (was 2e825a4).

    git branch -d删除分支时会检查分支是否完全合并到主干,如果不是,则会删除失败,并提示需要合并:

    $ git branch exp                        # 建立exp分支

    $ git checkout exp                      # 切换到exp分支

    $ echo "exp again" >> README.txt        # 修改并提交

    $ git commit -a -m "exp again"[exp 868e68c] exp again

     1 file changed, 1 insertion(+)

    $ git checkout master                   # 切换回masterSwitched to branch 'master'

    $ git branch -d exp                     # 删除失败

    error: The branch 'exp' is not fully merged.If you are sure you want to delete it, run 'git branch -D exp'.

    可以用git branch -D exp忽略修改,完全删除分支:

    $ git branch -D expDeleted branch exp (was 868e68c).

    查看远端git

    基础命令是:git remote show, git remote show X。

    $ git remote show

    origin

    web

    查看GitHub默认设置的origin

    $ git remote show origin* remote origin

      Fetch URL: git@github.com:berlinix/blog.git

      Push  URL: git@github.com:berlinix/blog.git

      HEAD branch: master

      Remote branch:

        master tracked

      Local branch configured for 'git pull':

        master merges with remote master

      Local ref configured for 'git push':

        master pushes to master (fast-forwardable)

    git命令快查

    以下列出一些常用的git命令

    命令

    说明

    基础操作

    git init

    初始化git仓库

    git add X

    添加X文件/路径到git仓库

    git commit -m "COMMENTS"

    提交更新

    分支管理

    git branch X

    创建一个名为X的分支

    git checkout X

    切换到X分支

    git merge X

    自动合并X分支

    git branch -d X

    删除X分支,需要先merge

    git branch -D X

    强制删除X分支,忽略其修改,无须先merge

    与远程git交互

    git remote show

    显示远程git仓库

    git remote show X

    显示远程git一个名为X的仓库

    git push origin master

    更新提交到GitHub

    Git日常问题

    撤销commit

    刚与master合并并提交后就后悔了现在要做的是撤销commit(revoke/undo merge/commit)。

    查看当前所在分支:

    $ git branch

      bs3* coin

      dev

      master

    查看日志:

    $ git log --oneline9b7ba39 merged with master73a66e8 update FAQ

    用以下2个命令来撤销提交(把COMMIT_SHA替换为实际的SHA值;把HEAD~N中的N替换为一个数字,表示回退几步):

    $ git reset --hard COMMIT_SHA

    $ git reset --hard HEAD~N

    例如回退到合并前:

    $ git reset --hard 73a66e8

    HEAD is now at 73a66e8 update FAQ

    回退后发现不对,因为现在这个commit还是在master中的(在merge之前master已经走的太远),赶紧再次reset到merge时的状态:

    $ git reset --hard 9b7ba39

    HEAD is now at 9b7ba39 merged with master

    如此一来就是就是merge后commit之前的状态。接下来就是要完成undo merge(已经undo commit了):

    $ git revert -m 1 9b7ba39

    这下就彻底回到merge前了,以防万一再次检查:

    $ git diff --name-status master..coin

    看起来没什么问题了,检查下日志:

    $ git log --oneline2691516 Revert "merged with master"9b7ba39 merged with master73a66e8 update FAQ

    git找回已删除文件

    首先找到与目标文件相关的最后一次commit。如果目标文件没有出现在HEAD commit中,那么在这次commit时,文件就被删除了:

    $ git rev-list -n 1 HEAD -- htdocs/myfile.php1e8182f58dc038c8e6bc2025e8430f463d372030

    接下来就是恢复工作了:

    $ git checkout 1e8182f58dc038c8e6bc2025e8430f463d372030^ -- htdocs/myfile.php

    合并分支的部分文件

    有时候只想合并分支里的部分文件,而不是整个分支,可以用这个命令:

    git checkout BRANCH FILE ...

    例如,从test_branch分支中合并file_modified文件:

    $ git checkout test_branch file_modified

    参考Git Tip: How to "Merge" Specific Files from Another Branch

    分享

    2

    评论

    comments powered by Disqus

    首页 | 链接 | 网站地图 | 关于网站

  • 相关阅读:
    swift知识点 [1]
    Scala的安装,入门,学习,基础
    导入别人的项目源码,如何才可以正常运行呢???
    java.io.IOException: Could not locate executable nullinwinutils.exe in the Hadoop binaries.
    网站点击流数据分析项目----之现学现卖
    我的博客即将搬运同步至腾讯云+社区
    sqoop数据迁移(基于Hadoop和关系数据库服务器之间传送数据)
    工作流调度器azkaban(以及各种工作流调度器比对)
    日志采集框架Flume以及Flume的安装部署(一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统)
    Hive thrift服务(将Hive作为一个服务器,其他机器可以作为客户端进行访问)
  • 原文地址:https://www.cnblogs.com/songfahzun/p/7690980.html
Copyright © 2020-2023  润新知