likes
comments
collection
share

git操作整理汇总

作者站长头像
站长
· 阅读数 6
  • 使用git已经很久,但从未整体总结过,这次就对git的进行一次总结和思考。

一.为什么要使用git

  • 方便 版本控制
  • 版本控制:记录项目的所有变化,以方便查阅,回退。

二.版本控制的分类

  • 本地版本控制:复制整个项目,同时手动进行版本记录,比如1.0.02.0.0进行区分和管理。
  • 集中式版本控制:用一个中央服务器保存所有的版本记录,其他人从这取出文件,或者提交文件。
  • 分布式版本控制:每一人都拥有着当前项目的所有版本记录。修改和其他操作在本地进行,可以将自己的修改推送给别人。
  • 基于差异的版本控制:保存每个文件随着时间的差异记录。(这里就涉及到git中文件的状态,如何判断文件的差异呢)

三.git文件状态

  • 未跟踪: 没有被git记录的文件,比如.gitignore中的文件。新增的文件往往没有被跟踪,需要被add,加入暂存区,commit保存进git数据库中进行跟踪。类似与 修改(modified) 状态

  • 已跟踪: 纳入版本控制的文件。只有已被纳入版本控制的文件,才有下述三种状态。

    • 修改(modified): 在工作区修改文件。还没有进行 add 操作。

    • 暂存(staged): 已经进行 add 操作,把修改的文件进行标记,放到 暂存区。未commit进行保存。

    • 提交(commited): 已经进行commit,将 暂存区 的文件提交到本地数据库。

  • git status查看当前工作区的状态。

    • 工作区无任何修改:
       On branch main
       Your branch is up to date with 'origin/main'.
    
       nothing to commit, working tree clean
    
    • 工作区有修改的情况, .gitignore文件被修改了,需要进行add进入暂存区,commit进行提交。或者restore进行撤回操作。node_modules/下的文件未被跟踪,需要进行addcommit
    On branch main
    Your branch is up to date with 'origin/main'.
    
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in working directory)
            modified:   .gitignore
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
            node_modules/
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
  • 查看当前状态简略版:git status -s。M已修改文件,?? 未被git追踪文件,A暂存区文件

 M .gitignore
?? node_modules/

已经检查了当前工作区的状态,如果有文件被修改,那么就需要对比,看修改前后的区别。

四.查看文件的修改

  • git diff: 查看已在暂存区的文件和未暂存的文件做了哪些修改
diff --git a/.gitignore b/.gitignore
index 960be9a..0e9b283 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,3 @@
-node_modules
-package-lock.json
-yarn.lock
\ No newline at end of file
+# node_modules
+# package-lock.json
+# yarn.lock
\ No newline at end of file
  • git diff --staged: 查看已暂存(add) 的文件和 已提交(commited) 的文件有哪些变化。

五.暂存区

1.加入暂存区

  • git add .:将当前目录下的所有文件修改加入暂存区
  • git add -u: 将已被追踪的文件修改加入暂存区,可追溯上级目录。
  • git add -A: 将所有文件修改加入暂存区,可追溯目录修改,比如在目录第一层新增文件,现在处于目录的目录的目录,那么git add -A会找到最上一层的文件修改进行暂存。

2.撤销暂存区

  • git reset HEAD [file]: 撤销加入暂存区的指定文件
  • git reset HEAD *:撤销加入暂存区的所有文件,在Mac中不包括.开头的文件
  • git reset HEAD .*: 撤销加入暂存区的.开头的文件
  • git rm:加文件名或者目录或者正则匹配,移除暂存区
  • git rm -f:强制移除,连文件都直接删除(尽量不要使用)
  • git rm --cached:只是移除暂存区,不删除文件

六.提交文件

1.提交文件的操作:

  • git commit: 提交文件,接下来填写修改信息。
  • git commit -m: 提交文件同时填写修改信息。
  • git commit -a: 跳过暂存区,直接提交文件,等于跳过了git add操作

2.提交不可撤销,但可以替换

  • git commit --amend: 第二次的提交将替换第一次的提交,最终只会有一个体交

七.移动文件(更多是用来重命名)

  • git mv file_from file_to

八.查看提交历史

  • git log: 查看提交历史。

git操作整理汇总

  • git log -p: 查看提交历史和差异,会特别长。

git操作整理汇总

  • git log -p -2: 查看提交历史和差异,并限制日志条目,只显示最近两次的提交。

九.远程仓库

  • git clone [url]:克隆远程仓库
  • git remote: 查看所有的远程仓库,origin是默认远程仓库名

git操作整理汇总

  • git remote -v: 显示远程仓库名和地址

git操作整理汇总

  • git remote add [shortname] [url]: 添加远程仓库,同时指定一个shortname来简称它

通过这个命令,我们可以添加很多远程仓库,把一个项目推送到不同的远程仓库中。

  • git fetch [shortname]: 拉取远程[shortname]仓库中本地没有的信息,但并不会合并到本地中,需要手动合并。比如,本地长裤会有一个master分支和一个origin master分支。fetch会拉取远程仓库的master分支到本地的origin master而不会到master。如果需要,需要手动merge合并。但是pull命令则会同时更新本地的masterorigin master。如果有冲突,则会直接提示。

  • git push [remote] [branch]: remote表示远程仓库名字,branch表示分支,不指定默认当前仓库的当前分支。

  • git remote show [remote]: remote表示远程仓库名字,查看远程仓库的信息,默认当前仓库。

  • git remote rename [newname] [oldname]: 仓库重命名

  • git remote remove [name]: 移除远程仓库

十.分支

1.新建分支

  • git checkout -b [newbranch]: 从当前分支中克隆一个新分支,等同于
git branch [newbranch]
git checkout [newbranch]

2.切换分支

  • git checkout [branch]: 从当前分支切换到[branch]分支

3.查看分支

  • git branch: 查看当前分支。*号的表示当前分支

git操作整理汇总

  • git branch -v: 查看当前分支的最后一次提交

git操作整理汇总

4.合并分支

  • git merge [branch]: 当前分支合并指定的[branch]分支。如果遇到冲突,需要手动打开冲突的文件,进行解决。解决完之后,需要用git add 命令进行暂存。

  • git rebase [branch]: 变基合并,与merge不同的是,rebase会对比当前分支和指定分支[branch]的共同父分支。将指定分支[branch]作为基底,将修改的部分作为记录放在指定分支,即基底的后面,而不是形成一条新的分支记录。等同于git rebase [basebranch] [topicbranch]

  • git rebase --onto [A] [B] [C]: A,B,C是三个分支名。让C分支带着B和C共有的分支记录,合并进A分支记录的后面。

5.删除分支

  • git branch -d [branch]: 删除指定的分支,或者使用git branch -D [branch]
  • git操作整理汇总

零.一些不知道怎么归类的git操作

需求一:因为某些原因,需要一个github仓库,一个gitlab仓库,还有其他仓库等。不同的项目需要推送到不同的仓库。如何配置呢?

  1. 首先,每个仓库都需要一个密钥,涉及命令:
ssh-keygen:
-t: 生成密钥类型
-C: 提供注释
-f: 生成文件名字
  1. 举个例子:生成一个github的密钥文件,一个gitlab的密钥文件
  • ssh-keygen -t rsa -f id_rsa_github
  • ssh-keygen -t rsa -f id_rsa_gitlab
  1. 配置git的config,在~/.ssh文件中,设置默认的git推送地址 vim config
# Default 

Host default
    HostName ***.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa
Host gitlab
    HostName gitlab.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_gitlab
Host github
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_github
  1. 查看.ssh下的文件,添加公钥到远程仓库 cat id_rsa_gitlab git操作整理汇总

git操作整理汇总 5. 拉取不同仓库的项目 git clone git@[配置的名字]:https:***.git

配置的名字指上一步操作中,config文件中的Host