git 日常使用记录

379 阅读10分钟

GIT安装后配置

测试是否成功

git --version #查看git软件的版本信息 

第一次安装git后,软件需要配置信息

git  config  --global  user.name '名称信息'

git  config  -- global  user.email "email信息"

git  config  --list  #查看是否设置成功

基本用法

  1. 初始化仓库

    在当前目录下会自动生成一个 .git 目录

    当前目录下所有的文件都属于 Untracked 未跟踪

    git init
    
  2. 查看当前工作区的文件状态

    git status
    
    git status -s #简短命令
    
  3. 将工作区的未跟踪或修改的文件添加到暂存区

    git add 文件名 #添加指定文件到暂存区
    
    git add . #添加所有文件到暂存区
    
  4. 将暂存区的文件提交到本地代码库

    git commit -m "提交信息"
    
    git commit -a -m '提交的信息' (不推荐) #跳过暂存区直接提交到版本控制仓库
    
  5. git忽略文件 .gitignore

    .gitignore文件可以放在任意目录下,一个git项目中可以含有多个.gitignore文件,每个.gitigore 文件只对该.gitignore文件所处目录和其子目录有作用。 一般在项目的根目录中建立一个文件,命名为.gitignore 在这个文件中可以配置不提交到仓库中的文件及文件夹。 注意:文件目录以“/”开头,文件以“*”开头

    #注释           .gitignore的注释
    *.txt           忽略所有 .txt 后缀的文件
    !src.a          忽略除 src.a 外的其他文件
    /todo           仅忽略项目根目录下的 todo 文件,不包括 src/todo
    build/          忽略 build/目录下的所有文件,过滤整个build文件夹;
    doc/*.txt       忽略doc目录下所有 .txt 后缀的文件,但不包括doc子目录的 .txt 的文件
    
    bin/:           忽略当前路径下的 bin 文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件
    /bin:           忽略根目录下的 bin 文件
    /*.c:           忽略 cat.c,不忽略 build/cat.c
    debug/*.obj:    忽略debug/io.obj,不忽略 debug/common/io.obj和tools/debug/io.obj
    **/foo:         忽略/foo, a/foo, a/b/foo等
    a/**/b:         忽略a/b, a/x/b, a/x/y/b等
    !/bin/run.sh    不忽略bin目录下的run.sh文件
    *.log:          忽略所有 .log 文件
    config.js:      忽略当前路径的 config.js 文件
    
    /mtk/           忽略整个文件夹
    *.zip           忽略所有.zip文件
    /mtk/do.c       忽略某个具体文件
    
  6. 将本地代码库的代码上传到远程代码库

    git push -u origin master 
    #本地代码库第一次上传时 (-u)记住远程地址和分支下次上传就不需要了 (origin)远程仓库名 (master)主分支名
    
    git push
    
  7. 将远程代码库下载到本地代码库

    git pull
    

format,png.png

  1. 将别人的仓库克隆到本地(克隆成功就是一个 git 仓库)

    只要是 clone 过来的仓库就不需要初始化了, 也可以直接进行 push / pull

    git clone
    
  2. 在执行git push之前, 要保证当前的本地仓库有和远程仓库关联

    查看本地仓库是否有远程仓库

    git remote -v # 短指令
    git remote --verbose # 长指令 效果同上
    

    添加远程仓库的关联

    git remote add 关联的远程仓库名(一般都是 origin) 远程仓库的地址(ssh 地址)
    

    删除远程仓库的关联

    git remote remove 远程仓库名(一般都是 origin)
    
  3. 查看提交日志

    git log
    git log --oneline # 一行的形式展现, 显示精简信息
    
  4. 切换到以前的版本

    --hard 一定要慎用, 将工作区没有提交的代码全部清空, 不保存, 直接切换

    --soft 可以灵活使用, 将工作区没有提交的代码先添加到暂存区后再切换

    git reset --hard commit 'hash'
    git reset --hard HEAD~0 # 小技巧, 可以用 HEAD~0 表示回到最新的一次提交
    

    查看历史操作记录

    git reflog
    

多分支

format,png-16401407789212.png

  1. 创建分支

    git branch 分支名 # 使用频率较低
    git checkout -b 分支名 # 常用, 创建并切换至指定分支
    
  2. 查看分支

    git branch -a # 查看所有分支(包括远程分支)
    
  3. 切换分支

    git checkout 分支名
    
  4. 合并分支

    将指定的分支合并到当前分支, 一般执行merge的分支都是master

    git merge 分支名
    
  5.  删除分支

    git branch -d 分支名称   (需要合并后才能删除)
    
    git branch -D 分支名称    可以强制删除
    
  6. 本地操作远程仓库

    查看远程分支列表

    git remote show 远程地址
    

    提交本地分支到远程分支

    git push -u origin 本地分支:远程分支
    
    git push -u origin 分支(同名可以只写一次)
    

    拉取远程分支

    git fetch 远程地址  # 将远程仓库所有分支的最新版本全部取回到本地 
    git fetch 远程地址 远程分支:本地分支(相同可以只写一个) # 将远程仓库指定分支的最新版本取回到本地 
    
    

    删除远程分支

    git push 远程地址 --delete 远程分支名称
    

设置账户SSH公钥

在本地生成公钥与私钥

     ssh-keygen -t ed25519 -C "github或gitee的邮箱" # ed25519 
     #按照提示完成三次回车,即可生成 ssh key
     ~/.ssh/id_ed25519.pub #查看SSH公钥
     #复制SSH公钥到github或gitee添加公钥

image.png

image.png

谨慎操作

  1. 版本库中的文件覆盖工作区中的文件

    git chectout  -- 文件名
    
  2. 删除暂存区中的文件

    git reset HEAD 文件名
    
  3. 同时删除暂存区与工作区中的文件

     git rm -f 文件名
    
  4. 删除版本库中的文件

    git rm --cached 文件名
    

.gitignore不生效问题解决方法

1.第一种方法

.gitignore中已经标明忽略的文件目录下的文件,git push的时候还会出现在push的目录中,或者用git status查看状态,想要忽略的文件还是显示被追踪状态。 原因是因为在git忽略目录中,新建的文件在git中会有缓存,如果某些文件已经被纳入了版本管理中,就算是在.gitignore中已经声明了忽略路径也是不起作用的,这时候我们就应该先把本地缓存删除,然后再进行git的提交,这样就不会出现忽略的文件了。

//解决方法: git清除本地缓存(改变成未track状态),然后再提交:
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
git push -u origin master

需要特别注意的是:

1).gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。

2)想要.gitignore起作用,必须要在这些文件不在暂存区中才可以,.gitignore文件只是忽略没有被staged(cached)文件, 对于已经被staged文件,加入ignore文件时一定要先从staged移除,才可以忽略。

第二种方法 在每个clone下来的仓库中手动设置不要检查特定文件的更改情况。

git update-index --assume-unchanged PATH                  //在PATH处输入要忽略的文件

在使用.gitignore文件后如何删除远程仓库中以前上传的此类文件而保留本地文件 在使用gitgithub的时候,之前没有写.gitignore文件,就上传了一些没有必要的文件,在添加了.gitignore文件后,就想删除远程仓库中的文件却想保存本地的文件。这时候不可以直接使用"git rm directory",这样会删除本地仓库的文件。可以使用"git rm -r –cached directory"来删除缓冲,然后进行"commit""push",这样会发现远程仓库中的不必要文件就被删除了,以后可以直接使用"git add -A"来添加修改的内容,上传的文件就会受到.gitignore文件的内容约束。

git库所在的文件夹中的文件大致有4种状态

(1)Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add状态变为Staged

(2)Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改,而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件。

(3)Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作。 这个文件也有两个去处, 通过git add可进入暂存staged状态,使用git checkout则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改。

(4)Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为git commit状态.执行git reset HEAD filename取消暂存, 文件状态为Modified

Git 状态untrackednot staged的区别

1)untrack表示是新文件,没有被add过,是为跟踪的意思。

2)not staged表示add过的文件,即跟踪文件,再次修改没有add,就是没有暂存的意思。

开发过程中比较常见的工作流程 (PR)

GitFlow:git 工作流

  1. 会将 master 分支锁住, 任何人不得直接 push 到 master 分支, 保护 master

    意味着合并操作将没有意义了,即使合并了分支, 也无法推送到远程

  2. 既然不能直接提交到 master,就需要新建一个分支并提交到 dev 分支中最后推送给远程仓库

    git checkout -b dev # 新建分支
    git add . # 修改完代码后进行添加并提交
    git commit -m "描述信息"
    git push -u origin dev # 推送到远程仓库
    
  3. 在 git 管理平台(github 码云等) 新建 PullRequest

image-20211222110011311.png 4. 在 PR 中由其他成员(组长)进行 CodeReview(代码审查), 提出看法或整改建议

修改完毕后通过审查及测试,最后由组长进行合并

  1. 统一通过 PR 的方式提交, Pull Request

作为程序员,在开源世界中进行交流的两大方法:Issues(向作者提问)、Pull Request(向作者贡献代码)

看仓库最新的代码

  1. 拉取最新的代码

    git pull --all 
    
  2. 查看所有分支

    $ git branch -a
    * master
      remotes/origin/HEAD -> origin/master
      remotes/origin/art_pub
      remotes/origin/master
    
  3. 复制 remotes/origin/art_pub

  4. 切换分支

    git checkout remotes/origin/art_pub
    
  5. 会给很多提示信息, 可以不用理会, 代码已经更新

    $ git checkout remotes/origin/art_pub
    Note: switching to 'remotes/origin/art_pub'.
    ​
    You are in 'detached HEAD' state. You can look around, make experimental
    changes and commit them, and you can discard any commits you make in this
    state without impacting any branches by switching back to a branch.
    ​
    If you want to create a new branch to retain commits you create, you may
    do so (now or later) by using -c with the switch command. Example:
    ​
      git switch -c <new-branch-name>
    ​
    Or undo this operation with:
    ​
      git switch -
    ​
    Turn off this advice by setting config variable advice.detachedHead to false
    ​
    HEAD is now at 6a710b4 ✨ feat(ArticlePublish): 发表文章功能未完成
    ​
    Administrator@LEE-PC MINGW64 ~/Desktop/vue-ev-69 ((6a710b4...))
    ​
    

    关键词:

    HEAD is now at 6a710b4 ✨ feat(ArticlePublish): 发表文章功能未完成
    

创建多个文件快捷方式 (Linux操作系统或Git Bash 终端 输出)

//建立多个或一个新的子目录
    mkdir (跟文件目录名...可以多个)
//建立多个或一个新的子文件
    touch (跟文件名...可以多个)
//查看文件
    ll
//cd 命令用于切换当前工作目录
    ~ 也表示为 home 目录 的意思, . 则是表示目前所在的目录, .. 则表示目前目录位置的上一层目录。
//复制文件
    cp (跟文件名  文件位置)
//修改文件名
    mv (原文件名  新文件名)
//删除当前目录下的所有文件及目录,并且是直接删除,无需逐一确认命令行为
    rm  -rf  要删除的文件名或目录
//解压zip
    unzip (跟zip文件)