Marco Nie - git https://blog.niekun.net/tag/git/ Git 命令行基本操作 https://blog.niekun.net/archives/1252.html 2020-03-04T09:53:00+08:00 updated 23-04-06分享一个通过游戏的方式学习 git 常用命令的网站:https://learngitbranching.js.org/Git 是目前世界上最流行的版本控制工具,它可以记录历史操作和协同工作。Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.下面介绍 Git 命令行工具的安装和使用。Git 安装Windows从官网下载最新的安装包,然后在本地安装即可:https://git-scm.com/download/win安装完成后,打开 cmd 或 powershell 敲入下面命令确认安装成功:git version Linux官网介绍:https://git-scm.com/download/linux可以使用 apt 来安装:apt-get install git 如果 apt 安装的版本太旧,可以添加官方源来安装最新版:add-apt-repository ppa:git-core/ppa apt update apt install git 终端敲入下面命令确认安装成功:git version 基本命令官方手册:https://guides.github.com/introduction/git-handbook/git 命令大全:https://git-scm.com/docs初始化仓库将目录切换到想要进行版本控制的文件夹,输入下面命令初始化仓库,会在文件夹下建立 .git 目录:git init 克隆远程仓库复制远程仓库链接:在命令行下输入命令:git clone https://github.com/nie11kun/script.git 会将仓库下载到当前目录下。本地修改保存在仓库里进行过文件的增加/删除/修改等操作后,变动的文件还没有被 Git 追索引到,是 untracked 状态,需要将改动保存快照,这是进行远程推送及历史查询所必须的步骤。主要有两个命令:git add 和 git commit,git add 负责将文件快照保存,git commit 负责给这个快照最终命名和存档。首先将变动的文件 stage 起来,就是将文件当前信息存档,配合 option 来精细区分要 stage 的文件:# 将所有变动的文件 stage git add -A git add . # 只将修改和删除的文件 stage git add -u # 只将新建和修改的文件 stage,不包含删除的 git add --ignore-removal*注意在 Git 版本小于 2 时,git add . 和 git add --ignore-removal 是一个效果。然后将 stage 的文件用 commit 命令保存到仓库:git commit -m "给这个快照命名" 撤销修改(added/commited)在编程中我们经常会对修改部分需要撤销修改,使用命令可以方便的操作,主要有三种情况:untracked 文件,staged 文件,commited 文件。untracked对于只是进行了处理的文件(新建/修改/删除),只需要撤销修改即可:# 撤销单个文件 git checkout file # 撤销全部文件修改 git checkout .staged对于已经使用 git add stage 的文件,需要使用 reset 指令来撤销 stage:git reset 然后如果要撤销修改使用上面 untracked 的方法。commited对于已经使用 git commit 命令保存快照时,需要将 HEAD 指定到原来的:git reset --soft HEAD^ 这样就返回到 staged 的状态了,进一步的返回,参考上面 staged 的步骤。状态查询查询当前仓库的状态,对于进一步操作很有必要,可以看到那些文件进行了修改,还没有 track,保存的快照没有 push 等。执行以下命令:git status 本地和远程仓库同步如果本地仓库和远程服务器绑定,可以在两个直接进行推送和拉取。初始用户设定要和远程仓库同步数据,需要设定本地用户信息,如: email username 等,远程仓库会根据归类代码历史是属于哪个用户的:git config --global user.email "you@example.com" git config --global user.name "Your Name" git config --global push.default simple缓存 GitHub 密码信息-credential默认向远程服务器推送的时候,需要输入账户密码,为了便于操作,可以将账户信息缓存在本地。教程参考:https://niekun.net/archives/444.html绑定远程仓库复制远程仓库地址:在本地添加远程仓库,origin 分支就代表远程仓库:git remote add origin https://github.com/nie11kun/TestGit.git 将本地 master 分支推送到 origin 分支也就是远程分支,如果远程仓库是空的,使用 -u 参数来初始化,将本地 master 和 远程 master 分支绑定:git push -u origin master 同步远程仓库到本地git pull 推送本地存档到远程git push Git log 查看提交历史每次提交的 commit 都会产生一个记录信息,在仓库维护中经常需要查看历史记录,可以使用 git log 命令来处理。$ git log commit ca82a6dff817ec66f44342007202690a93763949 Author: Scott Chacon <schacon@gee-mail.com> Date: Mon Mar 17 21:52:11 2008 -0700 changed the version number commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 Author: Scott Chacon <schacon@gee-mail.com> Date: Sat Mar 15 16:40:33 2008 -0700 removed unnecessary test commit a11bef06a3f659402fe7563abf99ad00de2209e6 Author: Scott Chacon <schacon@gee-mail.com> Date: Sat Mar 15 10:31:28 2008 -0700 first commit执行命令后会返回每个提交的 commit 的相关信息:SHA-1 校验,作者,提交日期,提交说明等,最新的提交排在最前面。点击回车键可以进行翻页,输入 q 退出 log。默认返回的信息比较多,我们可以配合其他命令参数来过滤出我们需要的日志信息。--patch 差异对比当需要查看每条 commit 具体修改的文件内容时可以使用 log 的 --patch 或 -p 参数,会列出那些文件进行了修改,具体修改的地方,删除的部分前有减号-,添加的部分前有加号+:$ git log --patch commit ca82a6dff817ec66f44342007202690a93763949 Author: Scott Chacon <schacon@gee-mail.com> Date: Mon Mar 17 21:52:11 2008 -0700 changed the version number diff --git a/Rakefile b/Rakefile index a874b73..8f94139 100644 --- a/Rakefile +++ b/Rakefile @@ -5,7 +5,7 @@ require 'rake/gempackagetask' spec = Gem::Specification.new do |s| - s.version = "0.1.0" + s.version = "0.1.1" s.author = "Scott Chacon"--stat 统计信息如果想要知道每条 commit 对那些文件进行了处理,可以使用 log 的 --stat 参数。$ git log --stat commit dfe5904bb6f55dbeb3807d (HEAD -> branch_NK, origin/branch_NK) Author: Marco Nie <github@niekun.net> Date: Wed May 27 12:04:00 2020 +0800 FIX Source_Library/CMA/auto_operation/SW/C_OPERATION_AUTO.SPF | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) commit 6b0d30b6819971eb7545 Author: Marco Nie <github@niekun.net> Date: Sun May 24 15:17:47 2020 +0800 update .../HMI/hlp/chs/UserGuide/resources/img/pic63.png | Bin 0 -> 25684 bytes .../HMI/hlp/chs/UserGuide/section_1.html | 36 ++------------------- .../HMI/hlp/chs/UserGuide/section_11.html | 11 ++++--- 3 files changed, 9 insertions(+), 38 deletions(-)命令会再 git log 的基础上加入具体文件处理信息。--pretty 自定义log格式当我们只想查看每个 commit 的特定信息时,可以使用 --pretty 参数来处理。只输出 sha-1 和 提交说明:$ git log --pretty=oneline ca82a6dff817ec66f44342007202690a93763949 changed the version number 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test a11bef06a3f659402fe7563abf99ad00de2209e6 first commit自定义 LOG 格式:$ git log --pretty=format:"%h - %an, %ar : %s" ca82a6d - Scott Chacon, 6 years ago : changed the version number 085bb3b - Scott Chacon, 6 years ago : removed unnecessary test a11bef0 - Scott Chacon, 6 years ago : first commit使用自定义格式对于批量化的信息处理比较有用,可以避免 git 版本升级导致的 log 格式变化而带来的软件需要再次适配。可用的 format 参数:%H 提交的完整哈希值 %h 提交的简写哈希值 %T 树的完整哈希值 %t 树的简写哈希值 %P 父提交的完整哈希值 %p 父提交的简写哈希值 %an 作者名字 %ae 作者的电子邮件地址 %ad 作者修订日期(可以用 --date=选项 来定制格式) %ar 作者修订日期,按多久以前的方式显示 %cn 提交者的名字 %ce 提交者的电子邮件地址 %cd 提交日期 %cr 提交日期(距今多长时间) %s 提交说明--graph 展示分支合并历史当仓库有来自不同分支或成员的提交时,可以使用 --graph 参数来呈现相关 commit 的关联和归属。$ git log --pretty=format:"%h %s" --graph * 2d3acf9 ignore errors from SIGCHLD on trap * 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit |\ | * 420eac9 Added a method for getting the current branch. * | 30e367c timeout code and tests * | 5a09431 add timeout protection to grit * | e1193f8 support for heads with slashes in them |/ * d6016bc require time for xmlschema * 11d191e Merge branch 'defunkt' into local以上的 log 可以看到中间一部分的 commit 来自其他分支然后合并到了主分支里的过程。回到以前的版本当我们需要从当前的版本回到以前的某的状态时,有两种方法:reset 和 revert。reset 是完全退回到以前某个 commit 的状态,这会撤销这个 commit 之后所有的信息,相当于完全恢复到之前的状态。revert 并不是撤销而是提交一个新的 commit 将所有文件修改成某个特定 commit 的状态。可以通过 sha-1 来判断是 reset 还是 revert。通常我们通过 git log 来查看历史信息,找到需要回退到的 commit sha-1 哈希值,然后执行命令进行回退.reset使用 git log --stat 查看提交历史,找到需要回退的 commit 的 sha-1:$ git log --stat commit dfe5904bb6f55dbeb3807d5da78dc5a66460fccf (HEAD -> branch_NK, origin/branch_NK) Author: Marco Nie <github@niekun.net> Date: Wed May 27 12:04:00 2020 +0800 FIX Source_Library/CMA/auto_operation/SW/C_OPERATION_AUTO.SPF | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) commit 6b0d30b6819971eb7545bde1d864ce0c29e0f5dc Author: Marco Nie <github@niekun.net> Date: Sun May 24 15:17:47 2020 +0800 update .../HMI/hlp/chs/UserGuide/resources/img/pic63.png | Bin 0 -> 25684 bytes .../HMI/hlp/chs/UserGuide/section_1.html | 36 ++------------------- .../HMI/hlp/chs/UserGuide/section_11.html | 11 ++++--- 3 files changed, 9 insertions(+), 38 deletions(-)使用 git reset --hard sha-1 命令将版本回退:git reset --hard 6b0d30b6819971eb7545bde1d864ce0c29e0f5dc 使用 git log 命令查看当前 commit 是否已经回退到需要的版本。最后本地修改完成后,需要推送到远程,必须使用 --force 强制远程更新为本地当前版本:git push --force revert同样的方法,使用 git log --stat 查看提交历史,找到需要回退的 commit 的 sha-1。使用 git revert -n sha-1 返回这个状态,并使用 git commit -m 提交修改:git revert -n 6b0d30b6819971eb7545bde1d864ce0c29e0f5dc git commit -m "revert" 注意:这里可能会出现冲突,那么需要手动修改冲突的文件。而且要 git add 文件名。此时可以用 git log 查看本地的版本信息,可见多生成了一个新的版本.最后正常推送到远程:git push 参考链接Git 基础 - 查看提交历史 在 Windows 和 WSL 中共享 Git credentials 证书 https://blog.niekun.net/archives/1159.html 2020-02-26T12:34:00+08:00 将 Git 的 credential 证书保留在系统,可以避免每次操作都需要输入账户密码。各系统中设置缓存参考我的文章:https://niekun.net/index.php/archives/444.html对于 Windows 10 用户,系统内置了 Windows subsystem for Linux (WSL),我们可以共享存储在本地的 Git credential 证书,这样两个系统使用 git 都很方便。关于 WSL 的安装与使用参考:https://niekun.net/index.php/archives/1148.html首先在 Windows 10 下设置 credentials,在 power shell 下输入如下命令:git config --global credential.helper wincred 可以在仓库内测试执行 git push 命令,如果提示输入账户密码,则输入一次,以后就不会再提示了。然后在 WSL 设置,打开系统内安装好的 WSL,首先安装好 git,然后敲入如下命令:git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/libexec/git-core/git-credential-wincred.exe" 在 Git 中缓存 GitHub 密码信息-credential https://blog.niekun.net/archives/444.html 2019-10-28T14:22:00+08:00 git 有两种方式访问服务器:https ssh以下介绍两种方式进行一次设置,以后可以直接操作无需密码。ssh如果下载仓库的时候用的 git@git 的形式,代表是 ssh 方式下载的。在登录的时候需要使用 ssh key代替账号密码。关于 ssh key 参考官方介绍:https://help.github.com/en/articles/generating-an-ssh-keyhttps如果下载仓库的时候用的是 https ,则需要配置一个 credential helper 来告诉 git 记住账户密码。Windows终端执行如下代码,将证书存储到本地:git config --global credential.helper wincred 运行后操作一次 git push 如果提示输入密码,则输入一次,以后就不会再提示了。MacMac 下需要使用到 osxkeychain 来存储证书。首先检查是否已经安装了 osxkeychain:git credential-osxkeychain 如果没有安装,系统会自动提示下载包含credential-osxkeychain 的 Xcode Command Line Tools。或者使用 homebrew 来安装 Git 和 the osxkeychain helper:brew install git 终端执行如下代码,将证书安装到本地:git config --global credential.helper osxkeychain 运行后操作一次 git push 如果提示输入密码,则输入一次,以后就不会再提示了。LinuxLinux 下打开 credential helper 将账户密码存储在本地或缓存中。使用 cache 选项保存到缓存,默认将会缓存 15 分钟:git config --global credential.helper cache 修改缓存时间可以使用如下指令,单位:秒:git config --global credential.helper 'cache --timeout=3600' 使用 store 存储在本地,默认存储在 ~/.git-credentials:git config --global credential.helper store 二次验证 token如果开启了账户二次验证,则需要生成一个 Personal access token 来代替密码输入:在 github 账户设置中,进入 settings - Developer settings,点击 generate new token,在里面选择 repo 复选框,会生成一串字符,在命令行中输入账户密码时用它代替密码。首次设置如果第一次使用命令行需要做如下设置用户信息:git config --global user.email "you@example.com" git config --global user.name "Your Name" git config --global push.default simple