贡献者: addis
一个简单美观的 GUI 客户端是 GitHub Desktop(未必需要使用 GitHub),然而许多 GUI 的功能比起命令行来还是要少得多,例如 GitHub Desktop 不支持 stage,不支持把仓库或指定文件恢复到以前某个版本等.要安装 Git 命令行程序,Windows 用户可以下载 Git for Windows,Debian 或 Ubuntu 可以直接用 sudo apt install git 安装.Git for Windows 的 Git Bash 相当于 linux 的命令行,有当前路径 pwd, 更改路径用 cd.
git config --global user.name "用户名".
git config --global user.email "邮箱" 邮箱决定 commit 的作者.
clone, pull 等.要让 Git 记住账户密码,用 git config --global credential.helper store 如果 github 修改了密码,再用一次该命令即可,要测试是否成功可用 git pull,如果成功则不需要密码.
git config --global --unset credential.helper. 如果还不行的话只好把下文的所有 config 文件删除并重装 git.
git config --global core.autocrlf true, 这样 commit 的时候会把所有 CRLF 换行变为 LF, 而 checkout 的时候会把所有 LF 变为 CRLF. Linux 下设置 git config --global core.autocrlf input, 这样 commit 的时候会把所有 CRLF 变为 LF, 而 chekout 的时候不做任何操作.如果这么设置了,GitHub Desktop 自动产生的 .gitattribute 文件就可以删掉了(因为解决的是同一个问题).
git config --global core.quotepath off
git config --global core.longpaths true
git config core.protectNTFS false.但这么做可能仍会有一些问题(例如 windows 的文件夹中最后的.会自动删除)
git config --global core.editor "vim" 可以把用于 commit 的编辑器设为 vim
git config --global --add safe.directory "*"
git config --global http.postBuffer 2000000000(字节)
git init 可以把某个文件夹变为仓库,也可以现在 GitHub 上新建仓库再 git clone 到本地.
git status 用于查看仓库的当前状态,例如有哪些新增、改变和删除的文件.
git diff [文件或路径] 用于显示上次 commit 之后的改变,如果有文件被 add, 则显示其 add 之后的改变.
git add [文件或路径] 用于把改变的文件添加到 staging area, commit 的时候只会 commit 这些文件.如果文件又发生了改动,需要再次 git add.
git commit -am "标题"
git status 和 git diff 太常用,可以用 ctrl+r stat 或者 ctrl+r dif 等.如果不对就再按一次 ctrl+r 即可.这是命令行的功能不是 Git 功能.
安装后的设置
git fsck 可以检查数据库是否出现错误(硬盘坏点等)
git clone 时在后面加上 --depth N 选项可以只下载最后 N 次的 commit
git clone <url> newname 会把本地 repo 文件夹命名成 newname
. 开头的),git status 也不显示,git clean 也删不掉
git status 只会显示 worktree 和 index 之间的区别,而不一定是最新 commit 之间的(对于服务器上被 push 的 repo 而言)
git status 目录 可以只显示某个目录的 status
.git/config. 用户的 .gitconfig 文件可以在 home 目录(~)找到(对当前用户生效), git config --global 的设置全部存在这里.系统的设置文件可以在 linux 的 /etc/gitconfig 或 Windows 的 /C/ProgramData/Git/config 中找到(对所有用户生效). repo 中的设置覆盖用户设置覆盖系统设置.
git config --list 可以列出当前目录的所有 config, 注意如果有设置多次出现,后出现的为准.git config --show-origin <xxx.xxx> 可以显示某个 config 所在的文件.
.gitattributes 文件也有用户(而不是 repo)的版本,可以用 ~/.config/git/attributes 文件设置.
git init 即可.该命令会在当前目录创建 .git 文件夹,里面包含所有历史信息.
git clone https://... 即可.git 会 clone 到当前目录下.
git status 发现所有的文件都改变了,用 git config --global core.fileMode false 即可.如果还是不行就去掉 --global.
git clone <folder1> <folder2> 把 folder1 中的 repo 复制到 folder2 中.但注意路径要用 / 而不是 \. 如 /C/Users/addis/Documents/GitHub/cn2D/
git clone --no-checkout ... 选项可以只复制 .git 文件夹.
git status.
git add <file> 把变化添加到 staging area(也就是 index). 用 git add <dir>/ 添加目录,用 git add . 添加所有变化.
git add -u 可以只 add 修改的和删除的文件,新文件不 add
.gitignore 的例子:folder/ 忽略整个文件夹,folder/*.txt 忽略文件夹中的所有 txt 文件,folder/**/*.pdf 忽略 folder 文件夹和所有子文件夹中的 pdf 文件.
git diff 用于显示文件夹和 stage area 中的区别.git diff --staged 用于显示 stage area 和上一次 commit 的区别.git diff --name-only 可以只显示文件名.
git diff 的 --word-diff 选项可以显示行内的细微差别,当行比较长的时候使用(如 latex 段落).github 中有时候也不会显示具体位置.如果还想更精确,用 --word-diff-regex=.
git diff branchA branchB -- <filename> 用于比较两个 branch 中同一个文件.
git commit 用于自动打开文本编辑器信息并 commit. git commit -m "message" 直接把 message 作为 commit 信息.git commit -a 可以自动 git add 所有变化的文件,也可以在后面再加 -m "message".
git rm <file>. 这样做相当于手动删除文件,再 stage 该变化.如果文件已经 stage 了,用 git rm -f <file>.
git mv <file_from> <file_to>, 相当于 git rm <file_from> 再 git add <file>.(在 Windows 中,要改变文件名的大小写必须这么做而不能直接给文件重命名)
git log. 要显示每次 commit 的 diff, 用 git log -p, 要只显示前两次,用 -2. 用 --stat 可以显示基本统计(几个+几个-).
git log ... --name-only 只显示改变的文件名
git log -- <filename> 可以只显示一个一个文件的历史,-p 和 --word-diff-regex 同样有效
git log --grep=<pattern>
git log -- <filename>,
git commit --amend 可以覆盖上一次 commit (如果上一次 commit 忘了做什么事情).
git reset 可以 unstage 所有文件,git reset HEAD <file> 可以 unstage 一个文件.
git checkout -- <file> 可以撤销一个文件从上次 commit 后的变化(危险操作!). git checkout . 可以撤销所有文件从上次 commit 后的变化(危险操作!)但是他们不会影响 untracked files
git checkout folder checkout 的是 index,也就是 git add 保存的地方.而对于服务器上被 push 的 repo,index 和 HEAD 的版本很可能是不同的.这时用 git checkout master -- ... 的才是最新版本.
git checkout <hash> -- <file1> <file2>... 可以将某个文件还原到某次 commit 的状态.同样也适用于文件夹.这里的 <hash> 可以是某个 branch 的名字
git --work-tree=/path/to/outputdir checkout ... 可以指定 checkout 的路径,对 status 等命令同样有效
git --git-dir /path/to/repo 命令 可以指定 .git 所在的文件夹而无需先 cd 到那个文件夹
GIT_WORK_TREE=/some/path/ git checkout ... 可以把任何 git checkout 的内容输出到指定文件夹,注意这里的 GIT_WORK_TREE=/some/path/ 只有本次有效
git checkout-index -a -f --prefix=/some/path/ 可以把所有最新版本的所有内容从 .git 文件夹 checkout 到指定的文件夹,注意最后的 / 是必须的,-a 表示全部文件,-f 表示覆盖已有文件.如果要 checkout 某个文件,在后面用 -- 文件名 即可,要把 -a 去掉.这种方法不能 checkout 某个文件夹
git mv <old_name> <new_name2> 可以把某个文件重命名,包括只改变大小写(windows 中也可以,直接在文件夹中改变大小写是无效的)
git grep 可以在仓库中快速搜索关键词,grep --exclude-dir='.git' 则往往较慢.注意 git grep 不能搜到没有 add 的文件.
git remote 显示当前 repository 的 remote server shortname. 要显示网址,用 -v.
git remote add <shortname> <url> 添加一个 remote server (一个 repo 可以有多个 server).
git fetch <shortname> 从服务器上下载本地没有的数据.
git pull 的功能是 fetch 然后 merge.
git remote show <shortname> 显示 remote 的信息.
git remote rename <oldname> <newname> 可以修改服务器的名字.
git remote remove <shortname> 删除和服务器的连接(并不会删除服务器上的 repo)
git push 可以把当前 branch 的变化上传到服务器.后面可以加某次 commit 的编号如 abcd:master,或者如 HEAD~1:master.
git clone 的是某个空 project, 第一次 commit 后上传用 git push -u origin master
git pull 可以从服务器下载当前 branch 的变化.
git branch <name> 创造一个 new branch.
git checkout <name> 把文件夹中的文件切换成 <name> branch 中的文件.但是新的修改和 staging area 中的修改也会移植到 <name> branch 中.如果不想移植,就先 commit.
git checkout <name> 也可以用于从服务器上下载本地不存在的 branch.
git checkout <id> 可以把工作区间的所有文件修改到某次 commit 的状态,且不会影响当前的任何 branch. 这时会进入 'detached HEAD' 状态,所做的任何修改和 commit 在退出该状态后都会消失.
git checkout master 可以从 git checkout <id> 中恢复
git merge <name> 把 <name> branch 并入到当前 branch 中.
git merge --abort 可以恢复到 merge 以前.
git branch -d <name> 用于删除某个 branch.
git branch --set-upstream-to=origin/master 用于把 pull 和 push 的默认 remote 设置为 origin(或其他)
git push <remote> --delete <branch> 用于删除 server 上的 branch.
git push --set-upstream <server> <branch> 用于把某个 branch 推送到 server 上并 track.
git branch -vv 可以检查当前的默认 remote/branch,用于 push/pull
git branch --set-upstream-to <remote>/<branch> 可以将某个 remote 作为默认
git branch <name> <id> 用于从指定的 commit 创建 branch.
git clone -b <branch> --single-branch <url> 用于从 url 克隆一个指定的 branch.
git reset --hard 用于把 working directory 和 staging area 还原到最近一次 commmit 的状态.
git reset HEAD~1 等效于 git reset --mixed HEAD~1, 用于撤销最近一次 commit,文件夹中的文件不改变,改变的文件变为 changed not staged 的状态
git reset --soft HEAD~1 用于撤销最近一次 commit,改变的文件变为 staged 的状态
git reset --hard HEAD~1 用于撤销最近一次 commit (本地). 如果已经推送到了服务器,继续用 git push origin HEAD --force 即可.
git stash 可以临时保存修改(不包括 untracked 的文件)git stash -u 包括 untracked 的文件.git stash pop 可以恢复这些修改(相当于 merge).注意 pop 以后的文件并不一定和 stash 的时候一模一样,例如 stash 之后 pop 之前 pull 了一些变化,那么 pop 的时候相当于在这些变化的基础上 merge.
git filter-branch -f --tree-filter 'rm -rf <path/file>' HEAD 注意这样做本身并不一定会使 repo 变小.如果要清空一个文件夹,就用 path/* 就好
git gc --aggressive --prune=now 会可以将 repo 缩小,PhysWiki 的 .git 大概能缩小到一半.鼓励经常使用 git gc,但 --aggressive 选项会比较慢但也是安全的.gc 表示 garbage collection.该命令还可以让 .git 中的文件数量大大减小(copy 文件夹会快很多)
git gc 命令只对本地 repo 有效,其实最有效的貌似还是直接把本地 repo 删了再 clone 一次.但是注意检查是否有不小心被 .gitignore 屏蔽的文件没有在服务器上
git clean -f 可以清除 untracked file, -d 选项可以清除 untracked directory, git clean -n 显示将要清除的文件.
export LESSCHARSET=utf-8
git config --global core.quotepath false 显示 status 编码
git config --global gui.encoding utf-8 图形界面编码
git config --global i18n.commit.encoding utf-8 提交说明编码
git config --global i18n.logoutputencoding utf-8 输出 log 编码
在 linux 系统中,只需要一条设置,就是
git config --global core.quotepath false
gitk 可以弹出 GUI 显示每一次 commit 的文件目录,不需要 checkout 就可以看到.
git push 到一个 nonbare repo 一般是不允许的,除非这个 repo 设置了 git config receive.denyCurrentBranch warn 或者 git config receive.denyCurrentBranch ignore. 这时如果 push, 并不会改变 remote 的 working directory. (其实这正是我增量备份 .git 需要的!)
 
 
 
 
 
 
 
 
 
 
 
友情链接: 超理论坛 | ©小时科技 保留一切权利