GIT 的常规操作

GIT 的常规操作

常规操作也是我自己平时常用的几个命令, 学自于 pro git 这本书中

git 配置文件

  1. git的配置文件位置
    针对所有用户:/etc/gitconfig
    针对当前用户: ~/.gitconfig
  2. 查看配置的方法
    git config --list
  3. 修改配置的方法
    git config --global user.name "wangyubin"  (修改的是~/.gitconfig)
    git config --system user.name "wangyubin"  (修改的是/etc/gitconfig)

git 基本使用

  1. clone现有仓库

    git clone URL  (URL支持git,ssh,http,https等各种协议)
  2. git中文件的各个状态
    • unstaged - git仓库中没有此文件的相关记录
    • modified - git仓库中有这个文件的记录,并且此文件当前有改动
    • staged - 追加,删除或修改的文件被暂时保存,这些追加,删除和修改并没有提交到git仓库
    • commited - 追加或修改的文件被提交到本地git仓库(git仓库中大部分都是这种文件,所以git status不显示这些文件)
  3. 查看git仓库中各文件状态
    git status
  4. 初始化一个仓库
    git init

    在当前文件夹下生成.git目录,完成初始化,此时此文件夹下的所有文件处于unstaged状态

  5. 追加文件
    git add test.c

    test.c的文件变为staged状态,其他文件还是unstaged状态

    5.1 追加文件的结果1 - 恢复为原先状态(变为unstaged)

    git rm --cache test.c

    5.2 追加文件的结果2 - 提交到git仓库(变为commited)

    git commit -m "my message"
  6. 修改文件
    echo "aaa"  >> test.c

    test.c的状态变为modified

    6.1 修改文件的结果1

    git add test.c  (暂时保存修改的内容,即变为staged)

    下面有2条路可以选择:
    6.1.1 取消刚才的暂时保存

    git reset test.c  (状态变回modified)

    6.2.2 将暂存的修改提交到git仓库

    git commit -m "my message"

    6.2 修改文件的结果2

    git checkout test.c  (将test.c恢复为git仓库中的最新版本,即变为commited状态,test.c的内容和5.2节一样)
  7. 删除文件
    7.1 从git仓库和磁盘上删除文件
    git rm test.c  (当前目录中删除了test.c,在git仓库中暂时删除了test.c,相当于staged状态)

    7.1.1 从git仓库中删除test.c

    git commit -m "my message"  (git仓库以后不再维护test.c)

    7.1.2 删错了,恢复刚才的操作

    git reset HEAD test.c  (恢复到删除前的状态,当前目录中已删除的test.c也恢复了,test.c仍文commited状态)

    7.2 仅从git仓库中删除文件

    git rm --cache test.c (当前目录中没有删除了test.c,仅在git仓库中暂时删除了test.c,相当于staged状态)

    7.2.1 从git仓库中删除test.c

    git commit -m "my message"  (git仓库以后不再维护test.c,但是当前目录中仍然有test.c)

    7.2.2 删错了,恢复刚才的操作

    git reset HEAD test.c  (和7.1.2一样)

    7.3 误删除后的恢复
    如果删除了一个文件,并且commit之后发现删错了。也可以恢复,

    git log  (查看各次的提交信息)
    git checkout commit号  (恢复到未删除前的commint号,此时删除的文件也恢复到磁盘上了)
    git checkout master  (备份好删除的文件后,再回到最新状态)

git 远程仓库

  1. 查看远程仓库
    1.1 简单查看-所有仓库

    git remote (只能查看远程仓库的名字)

    1.2 查看更多内容-所有仓库

    git remote -v (远程仓库的名字及git地址)

    1.3 查看单个仓库的信息

    git remote show [remote-name]
  2. 新建远程仓库
    git remote add [shortname] [url]
    ex. git remote add mc git://www.host.com/gitdir/mycode.git
  3. 修改远程仓库
    git remote rename [oldnanme] [newname]
  4. 删除远程仓库
    git remote rm [remote-name]
  5. 远程仓库的数据
    5.1 获取数据
    git fetch [remote-name] (获取仓库的所有更新,但是不自动合并当前分支)
    git pull (获取仓库的所有更新, 并且自动合并到当前分支)

    5.2 上传数据

    git push [remote-name] [branch-name]
    ex. git push origin master

git 标签

  1. 列出标签
    1.1 查看所有tag

    git tag

    1.2 查看某个tag

    git show [tag-name]
  2. 新建标签
    2.1 轻量级tag
    git tag [tag-name]

    2.2 带标注的tag

    git tag -a [tag-name] -m "tag message"

    2.3 后期追加tag

    git log --pretty=oneline (查看所有的commit号)
    git tag -a [tag-name] [commit号前几位即可]
  3. 删除标签
    git tag -d [tag-name]
  4. 提交标签到远程仓库
    git push [remote-name] --tags
    ex. git push origin --tags

git 分支

  1. 查看和切换分支

    git branch (查看所有的分支及当前处于哪个分支)
    git branch -v (查看所有的分支的详细信息)
    git branch --merged (查看已经合并的分支)
    git branch --no-merged (查看还没合并的分支)
    git checkout [branch-name] (切换到某个分支)
  2. 新建分支
    git branch [branch-name]  (新建一个分支)
    git branch -b [branch-name] (新建一个分支并切换到这个分支上)
  3. 合并分支
    git merge [branch-name]
    ex. 将分支btest合并到主分支master
    git checkout master
    git merge btest

    merge时有冲突的文件会列出来,需要手动合并

    将冲突手动解决后,再次用 git status来查看是否还有 unmerged的文件。
    如果没有冲突的文件,就可以 git commit 来提交这次合并了。

  4. 删除分支
    git branch -d [branch-name]
    或者 git branch -D [branch-name] (强制删除某个还未合并的分支)
  5. 远程分支相关
    5.1 新建远程分支
    1. git checkout [local_branch] (首先进入想要上传的分支)
    2. git remote add [remote_repo] [remote_branch]
      (这里的[remote_branch]是远程分支的名字,一般和[local_branch]同名,
      [remote_repo]是远程仓库的名字)
    3. 2 向远程分支推送数据

      git push [remote_repo] [remote_branch]

    4. 3 删除远程分支

      git push [remote_repo] :[remote_branch] (注意远程分支前有个":")

  6. 合并分支的另一个方法:衍和

衍和可以简化master上的提交记录,使得代码可以方便的回退,
但是在公共仓库上用衍和有一定的风险。
衍和我基本用不上,这里就不赘述了。

服务器创建 git 仓库, 并将其作为远程仓库

其实 git 是分布式的 SCM. 并不存在谁是服务器, 谁是客户端的问题, 这里所说的服务器上的git仓库, 指的是多人合作开发时, 共用的, 作为最终发布版本的 git 仓库.
这个 git 仓库就相当于你在 github 上建的仓库, 会将你在各个电脑上做的代码等提交到上面进行统一管理.

  1. 服务端 (远程 git 仓库)

    • 生成用于git服务的账户 (一般就用git)

      groupadd gpxxx
      useradd -m -g gpxxx gitxxx
    • 初始化服务端的git 仓库
      cd ~/
      mkdir git-repo
      cd git-repo
      mkdir test.git
      cd test.git
      git --bare init
  2. 客户端 (本地 git 仓库)
    • 新建本地git 仓库

      cd ~/gitlocal
      mkdir test
      cd test
      git init
    • 初始化本地仓库
      touch README
      git add README
      git commit -m ‘first commit for init‘
    • 设置git用户信息
      git config --global user.name "wangyubin"
      git config --global user.email "[email protected]"
    • 关联远程仓库
      git remote add origin [email protected]<server address>:~/test.git/
    • 将本地仓库提交到远程
      git push origin master

git 使用中遇到的一些问题

git pull 时, 远程文件与本地文件有冲突

如果远程的仓库被其他人更新了, 并且更新的内容与我自己本地编辑的内容有冲突. 这时执行 git pull 可能有如下message:

Auto-merging path/to/conflict-file
CONFLICT (content): Merge conflict in path/to/conflict-file
Automatic merge failed; fix conflicts and then commit the result.

用文本编辑器 vim 或者 emacs 之类的来编辑冲突的文件 path/to/conflict-file, 冲突的地方有类似如下的显示

<<<<<<< HEAD
    App_Log.logger.debug(u‘开始时间: ‘ + utils.datetime2str(datetime.datetime.now()))
    file = request.FILES.get(‘file-xxx‘)
    App_Log.logger.debug(u‘结束时间: ‘ + utils.datetime2str(datetime.datetime.now()))

=======
    file = request.FILES.get(‘xxxx‘)
>>>>>>> 3602514cc2bf1b3a64470b31ad79e07fe372add5

===== 之上的 <<<<<<< HEAD 是本地的内容
===== 之下的 >>>>>>> 3602514cc2bf1b3a64470b31ad79e07fe372add5 是远程的内容(这个commit号每次都会不同)
根据实际情况, 删除多余的内容(包括===== >>>>> <<<<<< 之类的), 修改冲突的地方, 如果以本地的代码为准的话, 会得到如下结果:

App_Log.logger.debug(u‘开始时间: ‘ + utils.datetime2str(datetime.datetime.now()))
file = request.FILES.get(‘file-xxx‘)
App_Log.logger.debug(u‘结束时间: ‘ + utils.datetime2str(datetime.datetime.now()))

然后 git commit -am ‘提交的信息‘ 就解决了冲突.
最后, 也可以将本地的修改同步到远程 git 仓库: git push

git pull 时, 本地还有未commit 的文件

从远程仓库更新时, 假使本地还有没commit的文件A, 远程仓库的A文件却被修改了. 此时进行 git pull 时有如下信息:

6a707cc..f93575d  master     -> origin/master
Updating 6a707cc..f93575d
error: Your local changes to the following files would be overwritten by merge:
    apps/myapp/utils.py
Please, commit your changes or stash them before you can merge.
Aborting

此时, 如果不想将本地文件commit(可能只是临时的修改), 但是又像将远程的仓库更新下来, 可以这样:

$ git stash    # 先将自己的改变保存起来
Saved working directory and index state WIP on master: 6a707cc ...
HEAD is now at 6a707cc ...
$ git pull     # 从远程仓库更新
Updating 6a707cc..f93575d
... ...
$ git stash pop   # 将自己的修改合并到更新后的代码中

最后一步如果有冲突, 再参照上一节中解决冲突的步骤, 用文本编辑器修改冲突文件.

git 分支合并时的冲突

正在开发的分支和主分支的编辑了同一个文件时, 在主分支上进行 merge 的时候可能会产生冲突.
以下构造一个冲突的示例:

$ git branch test  # 创建一个分支 test, 但是没有进入test分支, 此时还在 master 分支上.
$ vim xxxx         # 编辑 master 分支上的一个已有的文件
$ git commit -am ‘xxx message‘  # 提交 master 分支的修改
$ git checkout test    # 切换到 test 分支
$ vim xxxx             # 编辑之前在 master 上编辑的文件, 可以编辑同一个地方, 造成冲突
$ git commit -am ‘xxx message‘  # 提交 test 分支的修改
$ git checkout master           # 切换到 master 分支
$ git merge test                # 将 test 分支合并到 master 分支, 由于上面编辑了同一文件, 这里会产生冲突
Auto-merging xxxx
CONFLICT (content): Merge conflict in xxxx
Automatic merge failed; fix conflicts and then commit the result.

最后, 参照上一节中解决冲突的步骤, 用文本编辑器修改冲突文件.

通过 git 提取补丁

提取的补丁的方法有多种:

$ git format-patch -1     # 提取本次 commit 和上次 commit 之间的不同, 并生成patch文件
$ git format-patch -2     # 提取本次 commit 和 上上次 commit 之间的不同, 并生成patch文件
$ git format-patch commit号1 commit号2  # 提取2次commit号之间的不同, 并生成patch文件 (commit号可以通过 git log 来查看)
$ git format-patch tag1 tag2            # 提取2次tag之间的不同, 并生成patch文件 (tag可以通过 git tag 来查看)

通过 git 提取指定版本的源码

这个功能在部署的时候比较有用.

$ git archive --format=tar --prefix="tagxx/" tagxx > ../tagxx.tar  # 获取 tagxx 的源码, 加了 --prefix 的作用是在最终的 tagxx.tar 中加了一层文件夹 tagxx

上面的 tagxx 也可以是 commit号

时间: 2024-10-13 06:32:24

GIT 的常规操作的相关文章

git bash 常规操作

配置本机的用户名和Email地址 git config --global user.name "Your Name" git config --global user.email "[email protected]" 使用init命令将当前目录初始化为Git仓库 git init 将数据提交到git仓库 第一步:添加文件 git add . 添加所有的文件.文件夹 git add <file> 添加指定名称的文件,<>内部写文件全称 注:如

svn常规操作与相关知识

Svn常规操作与相关知识 一.何谓版本控制 它是一种软件工程籍以在开发的过程中,确保由不同人所编辑的同一档案都得到更新,它透过文档控制记录程序各个模块的改动,并为每次改动编上序号,并且编辑错误之后还可以回溯到以前的版本 二.可供我们选择的版本控制系统 1.VCS  (本地版本控制) 2.VSS.CVS(集中版本控制) 3.ClearCase.SVN.Perforce.TFS(集中版本控制) 4.Mercurial(水银/水星).Git(分布式版本控制) 差异: 1.Git和其他版本控制系统的主要

gitlab的常规操作-远程发布

gitlab的常规操作 gitlab是我自己搭建,可以参考gitlab搭建 首先需要配置web端的ssh密钥才能操作远程,配置过程如下: 在linux主机上先做密钥认证 # ssh-keygen 认证成功后,我们可以发现在本地目录/root/.ssh/下会发现有id_rsa.pub的文件,把该文件的内容复制到web端,做ssh的密钥 [[email protected] ~]# ls  /root/.ssh/ authorized_keys  id_rsa  id_rsa.pub  known_

Git常用的操作

1.git使用的常规操作 git pull-->编辑-->git add-->git commit-->git push 用git add把文件添加进去,实际上就是把文件修改添加到暂存区: 用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支: 用git push 提交到远程的仓库. 其实就是工作区--git add-->暂存区--git commit-->HEAD 2.比较本地仓库与远程仓库不同: git status 只能查看未push提交的次

git bash 常用操作文件命令

git bash常用操作文件命令 在Windows下使用Git Bash,用的是Linux命令,常用几个文件操作命令如下: Windows命令 Linux 命令 意义 Windows命令 Linux 命令 意义 cd e:\xxx cd /e/xxx 切换到xxx目录 cd pwd 显示当前目录路径 dir ls 列出当前目录内容 copy nul xxx.txt touch xxx.txt 生成名为xxx.txt的空文件 del xxx.txt rm xxx.txt 删除xxx.txt文件 m

Mac下Git的基础操作

目前最火的版本控制软件是Git了吧,今天简单梳理一下Mac下Git的基础操作~~ 一.什么是Git Git是一个分布式代码管理工具,用于敏捷的处理或大或小的项目,类似的工具还有svn. 基于Git的快速的.免费的.稳定的在线代码托管平台有github,还有一些国内的,coding.csdn代码托管平台.京东代码托管平台等等. 二.Git的基本使用 1.注册一个git账号 咱们以coding代码托管平台为例来简单介绍 A.登陆coding网站https://coding.net/,注册coding

Git Book 中文版 - Git的撤消操作 - 重置, 签出 和 撤消

Git Book 中文版 - Git的撤消操作 - 重置, 签出 和 撤消 Git的撤消操作 - 重置, 签出 和 撤消 Git提供了多种修复你开发过程中的错误的方法. 方法的选择取决于你的情况: 包含有错误的文件是否提交了(commited); 如果你把它已经提交了, 那么你是否把有错误的提交已与其它人共享这也很重要. 修复未提交文件中的错误(重置) 如果你现在的工作目录(work tree)里搞的一团乱麻, 但是你现在还没有把它们提交; 你可以通过下面的命令, 让工作目录回到上次提交时的状态

Apache服务器常规操作

导读 Apache是世界上排名第一的Web服务器,50%以上的Web服务器都在使用Apache,它几乎可以在所有计算机平台上运行.下面就由我给大家说说Apache服务器的一些常规操作. Apache服务器的安装 一般情况下,Apache随Linux系统一起安装.安装时,选择Web Server组件,即可在系统中安装Apache.用户的工作主要是配置服务器. 检查系统中是否已经安装Apache 在Red Hat Linux下,用户可以执行以下命令查看系统中是否存在Apache及其版本: [[ema

git命令行操作

从本地上传代码到仓库(假设已经建好仓库): 1.初始化: git init 2.将所有文件加入缓存区: git add * 3.提交当前工作空间的修改内容: git commit -m 'commit info' 4.将仓库连接到远程服务器(server仓库地址): git remote add origin <server> 5.改动内容推送到远程master(如果报rejected错误,要先pull一下再push): git push -u origin master (在第一次推送mas