所有文章阅读量
UP | HOME

git-学习笔记

1. git set proxy

git设置代理教程 git-proxy.html

2. git设置信息: git config

  1. 所有的配置都在~/.gitconfig内
  2. 完善自己的用户名和信息

    $ git config --global user.name "pengshao"
    $ git config --global user.email "pengshao@gmail.com"
    

    –global参数是整个机器上面的全局参数

  3. git设置颜色

    $ git config --global color.ui true
    $ git config --global color.ui 1
    
  4. 自动更正

    $ git config --global help.autocorrect 1
    
  5. Git 命令自定义别名

    别名用来帮助你定义自己的 git 命令 比如你可以定义 git a 来运行 git add –all。

    • 要添加一个别名, 一种方法是打开 ~/.gitconfig 文件并添加如下内容:

      [alias]
      co = checkout
      cm = commit
      p = push
      # Show verbose output about tags, branches or remotes
      tags = tag -l
      branches = branch -a
      remotes = remote -v
      
      • 或者在命令行里键入:

        $ git config --global alias.new_alias git_function
        

        例如:

        $ git config --global alias.cm commit
        #指向多个命令的别名可以用引号来定义:
        $ git config --global alias.ac 'add -A . && commit'
        
      • 下面列出了一些有用的别名:

        Alias Command
        git cm git commit
        git co git checkout
        git ac git add . -A git commit
        git st git status -sb
        git tags git tag -l
        git branches git branch -a
        git cleanup git branch –merged \ grep -v '*' xargs git branch -d
        git remotes git remote -v

3. 建立repository: git init

git init—添加当前目录为git仓库

git init
Initialized empty Git repository in /home/pengshao/tmp/gitlearn/.git/

4. git添加文件: git add *.***/git commit

  1. git add *.***

    pengshao@ps-debian:~/tmp/gitlearn$ 
    pengshao@ps-debian:~/tmp/gitlearn$ git add readme.org 
    pengshao@ps-debian:~/tmp/gitlearn$ 
    

    这样就添加了一个git文件到自己的git仓库了.

  2. git commit -m 'add readme.txt to my Git repository'

    pengshao@ps-debian:~/tmp/gitlearn$ git commit -m 'add 2.org file'
    
    [master 528d873] add 2.org file
    
    your configuration file:
    
     git config --global --edit
    
     After doing this, you may fix the identity used for this commit with:
    
     git commit --amend --reset-author
    
     1 file changed, 1 insertion(+)
     create mode 100644 2.org
     pengshao@ps-debian:~/tmp/gitlearn$ 
    

    git会告诉你,1 file changed, 1 insertion(+)

  3. git add 和 git commit 介绍

    1. git add 一次只能添加一个文件
    2. git commit一次可以添加很多文件
    $ git add file1.txt
    $ git add file2.txt file3.txt
    $ git commit -m "add 3 files."
    

5. repository status: git status

  1. 修改2.org这个文件
  2. git status–命令 查看git repository 近况

    pengshao@ps-debian:~/tmp/gitlearn$ 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:   2.org
    
    no changes added to commit (use "git add" and/or "git commit -a")
    pengshao@ps-debian:~/tmp/gitlearn$ 
    
  3. 上面的代码告诉我们,有一个文件修改了 但是没有commit到git repository

6. 查看文件不同: git diff *.***/git

git diff—查看文件的不同之处

  1. 可以用git diff *.***查看两个文件之间的不同之处.

    pengshao@ps-debian:~/tmp/gitlearn$ git diff
    WARNING: terminal is not fully functional
    -  (press RETURN)
    diff --git a/2.org b/2.org
    index 77a872f..dc92c40 100644
    --- a/2.org
    +++ b/2.org
    @@ -1 +1,2 @@
    -my git test
    +this is my git test file
    +我要继续学习git
    pengshao@ps-debian:~/tmp/gitlearn$ 
    

    通过上面的代码就能看到两个文件之间的不同了

  2. 知道了文件之间的不同之处之后就能够放心的commit了
  3. git add *.***

    pengshao@ps-debian:~/tmp/gitlearn$ git add 2.org 
    pengshao@ps-debian:~/tmp/gitlearn$ 
    

    linux哲学,没有任何的输出

  4. git status 查看一下当前的 repository 这时候会提示modefied文件会有一个2.org 这时候就能进行commit了
  5. git commit -m '我要继续学习git'

    pengshao@ps-debian:~/tmp/gitlearn$ git commit -m '2.org->我要继续学习git字行'
    [master 197daf9] 2.org->我要继续学习git字行
    your configuration file:
    
     git config --global --edit
    
     After doing this, you may fix the identity used for this commit with:
    
    git commit --amend --reset-author
    
    1 file changed, 2 insertions(+), 1 deletion(-)
    pengshao@ps-debian:~/tmp/gitlearn$ 
    

    告诉我们一个文件改动了,添加了新的两行(+),删除了一行(-)

  6. git status 在查看一下啊

    pengshao@ps-debian:~/tmp/gitlearn$ git status
    On branch master
    nothing to commit, working tree clean
    pengshao@ps-debian:~/tmp/gitlearn$ 
    

    更改已经完成

7. 版本的回退: git reset –hard HEAD^

7.1. 在Git中,用HEAD表示当前版本

HEAD^: 上一个版本就是 HEAD^^: 上上一个版本就是 当然往上100个版本写100个比较容易数不过来 HEAD~100: 回到第一百个版本

$git reset --hard HEAD^
HEAD is now at b0c58a0 这是我的第一个git文件

7.2. 也可以红SHA1计算出来的那个大的数字–版本号来代替HEAD^

$ git reset --hard b0c58a0

这样和那样的效果是一样的 只要没有关电脑能找到版本号就能这样回退版本

7.3. 如果关掉电脑找不到版本号了可以通过: git reflog来找到全部的版本号码

pengshao@ps-debian:~/tmp/gitlearn$ git reflog
b0c58a0 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
bcc625b HEAD@{1}: commit: 添加了记笔记的选项
b0c58a0 (HEAD -> master) HEAD@{2}: commit (initial): 这是我的第一个git文件
pengshao@ps-debian:~/tmp/gitlearn$ 

8. 操作日志: git log/git reflog

9. working dirctory + Repository+stage概念

workingdirectory.jpeg 当前目录就是工作区 工作区里面的.git文件就是版本库 最重要的就是称为stage(或者叫index)的暂存区 还有Git为我们自动创建的第一个分支master 以及指向master的一个指针叫HEAD

  1. git add *.*** 实际上是把文件或者修改提交到stage
  2. git commit 实际上是把缓存区的更新提交到master分支

10. 撤销修改: git checkout – ./my-first-git.org

git checkout 可以撤销没有提交到stage的修改 git reset HEAD 可以撤销掉提交到stage的修改

11. 删除文件: git rm *.***

11.1. 用rm或者git rm删掉的文件也是一个针对版本库的修改项目

git rm *.*** 从而在版本库中同步删除 git commit -m '**' 来提交到版本库中

11.2. 删错了恢复: git checkout – ./***.***

12. 远程仓库: github 使用教程

12.1. 本地上传远程库

  1. 在github上面 create a new repository
  2. 本地关联远程仓库

    $git remote add origin https://github.com/boxmaking/learngit-note.git
    

    这一步是关联远程仓库的命令 并且在本地仓库新建一个origin的远程分支

  3. 第一次推送master和所有内容

    $git push -u origin master
    

    实际上就是把本地的master分支推送到远程 由于远程库是空的,我们第一次推送master分支时,加上了-u参数 Git不但会把本地的master分支内容推送的远程新的master分支 还会把本地的master分支和远程的master分支关联起来 在以后的推送或者拉取时就可以简化命令

  4. 推送最新的内容

    $git push origin master
    

    把本地master分支的最新修改推送至GitHub

  1. 远程仓库比本地仓库提前一个版本

    $git pull origin master
    

12.2. 远程仓库的clone

要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆

13. 快速添加许可证文件

创建一个仓库时,Github会为你提供一个预置的软件许可列表:

对于已有的仓库,可以通过 web 界面创建文件来添加软件许可

输入LICENSE作为文件名后,同样可以从预置的列表中选择一个作为模板。

这个技巧也适用于 .gitignore 文件。

14. 工作区去除大量已删除文件

当用 /bin/rm 命令删除了大量文件之后 你可以用下面一条命令从工作区和索引中去除这些文件

$ git rm $(git ls-files -d)

例如:

$ git status
On branch master
Changes not staged for commit:
	deleted:    a
	deleted:    c

$ git rm $(git ls-files -d)
rm 'a'
rm 'c'

$ git status
On branch master
Changes to be committed:
	deleted:    a
	deleted:    c

15. 没有任何改动的提交

可以使用–allow-empty选项强制创建一个没有任何改动的提交:

$ git commit -m "Big-ass commit" --allow-empty

这样做在如下几种情况下是有意义的:

  • 标记新的工作或一个新功能的开始。
  • 记录对项目的跟代码无关的改动。
  • 跟使用你仓库的其他人交流。
  • 作为仓库的第一次提交,因为第一次提交后不能被

16. 美化相关

  • 美化git status git status加上-sb选项:

    $ git status -sb
    
  • 美化 Git Log 输入如下命令:

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

17. Git Stash 使用教程

17.1. 核心功能

临时保存工作目录和暂存区的修改,允许切换分支或处理其他任务后恢复[1](@ref)[10](@ref)[47](@ref)。

17.2. 基础命令

  1. 存储修改
    • `git stash` 或 `git stash push`:保存当前修改到栈顶(默认不包含未跟踪文件)[1](@ref)[23](@ref)
    • `git stash save "备注"`:添加描述性注释(推荐)[1](@ref)[10](@ref)
    • `git stash -u`:包含未跟踪文件(Untracked files)[10](@ref)[23](@ref)
    • `git stash -a`:包含所有文件(包括 `.gitignore` 忽略的文件)[23](@ref)
  2. 查看存储列表
    • `git stash list`:显示所有存储记录(格式:`stash@{n}`)[1](@ref)[10](@ref)[30](@ref)
  3. 恢复修改
    • `git stash pop`:恢复栈顶记录并删除(默认恢复工作区)[1](@ref)[47](@ref)
      • `git stash pop –index`:同时恢复暂存区状态[1](@ref)
    • `git stash apply stash@{n}`:恢复指定记录但不删除[1](@ref)[10](@ref)
  4. 删除记录
    • `git stash drop stash@{n}`:删除指定记录(默认删除栈顶)[1](@ref)[23](@ref)
    • `git stash clear`:清空所有存储[1](@ref)[10](@ref)
  5. 高级操作
    • `git stash show -p stash@{n}`:查看存储的详细差异[30](@ref)[47](@ref)
    • `git stash branch <新分支名> stash@{n}`:基于存储创建新分支[10](@ref)[58](@ref)
    • `git stash -p`:交互式选择部分修改存储[1](@ref)[10](@ref)

17.3. 应用场景

  1. 场景1:紧急切换分支
    1. 开发中需处理其他任务时: ```shell git stash save "开发中登录功能" git checkout hotfix

      git checkout dev git stash pop ``` (引用:[1](@ref)[47](@ref))

  2. 场景2:同步错误分支代码
    1. 将代码误写入分支B时: ```shell git stash git checkout A git stash pop ``` (引用:[1](@ref)[10](@ref))
  3. 场景3:选择性存储
    1. 仅存储指定文件: ```shell git stash push file1.txt file2.txt ``` (引用:[23](@ref)[58](@ref))

17.4. 注意事项

  • 未跟踪文件需显式包含(`-u`或`-a`)[10](@ref)[23](@ref)
  • 恢复时可能冲突,需手动解决(类似`git merge`)[10](@ref)[76](@ref)
  • 避免长期存储,及时清理无用记录[10](@ref)[47](@ref)
  • 使用`git fsck –lost-found`可恢复误删的存储[1](@ref)

17.5. 示例代码块

# 存储当前修改(包含未跟踪文件)  
git stash save -u "紧急修复前的中间状态"  

# 查看存储列表  
git stash list  

# 恢复第二个存储并保留记录  
git stash apply stash@{1}  

# 删除所有存储  
git stash clear  

注:以上内容基于搜索结果整理,可通过 `C-c C-c` 在 Org-mode 中折叠/展开代码块。如需更详细参数说明,可参考 Git 官方文档或执行 `git stash –help`。

18. 一些特殊的情况我遇到的.

当遇到这种情况,可以按照以下步骤来处理:查看本地状态 首先,在本地使用git status命令查看当前的状态,确认a文件处于修改未提交的状态,以及远程仓库中a文件已被删除的情况。

• 保留本地修改并将其提交到远程: 如果你希望保留对a文件的本地修改,可以先将本地修改暂存起来,使用git stash命令。 然后从远程仓库拉取最新的更改,这会删除本地的a文件,再使用git stash apply命令 将暂存的修改应用回来,此时可以将a文件添加到暂存区并提交,最后推送到远程仓库。

• 放弃本地修改并与远程保持一致:如果本地对a文件的修改不再需要, 那么可以直接使用git checkout – a命令放弃本地对a文件的修改, 然后使用git pull命令从远程仓库拉取最新的更改,这样本地的a文件就会被删除,与远程仓库保持一致。

19. 从版本控制中移除不想跟踪的文件

  1. 从 Git 版本控制中移除文件
1: git rm --cached a

作用:从 Git 索引(暂存区)中移除文件 a,但保留本地文件。 此操作会生成一条删除记录,提交后远程仓库会删除该文件。 原理:–cached 参数仅删除暂存区的文件关联,不会影响本地文件系统。

  1. 提交删除操作到仓库
1: git commit -m "移除对文件a的跟踪"
2: git push origin main

结果:远程仓库中的 a 文件会被删除,但本地文件仍保留。

  1. 将文件加入 .gitignore

在项目根目录的 .gitignore 文件中添加文件名即可 作用:防止 Git 未来再次跟踪 a 文件。即使本地修改 a,也不会出现在未跟踪列表中。

  1. 提交 .gitignore 的更改
git add .gitignore
git commit -m "更新.gitignore忽略文件a"
git push origin main

必要性:确保其他协作者拉取代码后,也不会跟踪 a 文件。

  • 注意事项 协作者同步问题 其他开发者在拉取你的提交后,远程仓库中的 a 文件会被删除。如果他们需要保留本地的 a 文件,需手动执行以下操作:

    1: Bash
    2: git rm --cached a
    3: git reset HEAD a  # 取消暂存区的删除操作
    

    否则,他们的本地文件可能在 git pull 后被删除。

    已修改文件的处理 如果 a 文件在本地已被修改但未提交,直接运行 git rm –cached 会报错。此时需要强制操作:

    1: git rm -f --cached a  # 强制移除
    

    恢复误删文件 若误删了远程仓库的 a 文件,可通过历史提交恢复:

    1: git checkout <commit-hash> -- a  # 从指定提交恢复
    

    操作原理解析

    git rm –cached 的作用 仅解除 Git 对文件的跟踪,保留本地文件。 生成一个删除提交,同步到远程仓库后触发文件删除。

    .gitignore 的生效条件 仅对未跟踪(Untracked)文件有效,已跟踪文件需通过 git rm –cached 解除关联后再添加到 .gitignore。

    Git 三区模型 工作区:本地实际文件。 暂存区:待提交的变更。 版本库:已提交的历史记录。 git rm –cached 操作针对暂存区和版本库,不影响工作区。

通过以上步骤,你可以在保留本地文件的同时,从远程仓库彻底删除文件并停止跟踪,且未来修改也不会被 Git 检测到。

日期: <2025-03-14-073/Friday>

作者: pengshao

Created: 2025-03-16 Sun 20:29

Validate