# ZCTA_Git_tutorials **Repository Path**: collaalloc/zcta_-git_tutorials ## Basic Information - **Project Name**: ZCTA_Git_tutorials - **Description**: 卓创科技社团Git教程 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 7 - **Created**: 2021-12-12 - **Last Updated**: 2021-12-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 1. 创建新文件夹 名字任意 mkdir test_git # 2. 进入文件夹目录 cd test_git # 3. 显示当前目录路径 pwd 注意: PRINT : 形如/d/blog/test_git win 下保证路径无中文 # 4. 创建 git 可管理的仓库 git init PRINT : Initialized empty Git repository in D:/blog/test_git/.git/本地仓库创建成功 在仓库中创建 test.txt, 写入以下内容并保存: 1 2 # 5. 把文件添加到 git 仓库暂存区 git add test.txt (1) 问题 1: PRINT : warning: LF will be replaced by CRLF in test.txt. The file will have its original line endings in your working directory 解答: Linux/Unix 采用换行符 LF 表示下一行 Windows 采用回车+换行 CRLF 表示下一行 使用 git config core.autocrlf false 关闭自动转换换行符 也可加 --global 修饰 --> (2) 问题 2: PRINT : fatal: not a git repository (or any of the parent directories) 解答: Git 命令必须在 Git 仓库目录内执行(git init 除外), 在仓库目录外执行是没有意义的。 --> (3) 问题 3: PRINT : fatal: pathspec 'test.txt' did not match any files 解答: 添加某个文件时, 该文件必须在当前目录下存在, 用 ls 或者 dir 命令查看当前目录的文件, 看看文件是否存在, 或者是否写错了文件名。 # 6. 把文件提交到仓库 git commit -m "1 and 2" -m 后字符串为本次提交的说明。 PRINT : [master (root-commit) 97bb9a3] 1 and 2 1 file changed, 9 insertions(+) create mode 100644 readme.md commit 可以将 add 的多个文件一次性提交, 比如可以分别 add file1/file2/file3, 然后一次性 commit # 7. 在 test.txt 中新写入一行 4, 查看仓库当前的状态 git status 看一下输出: On branch master Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git restore ..." to discard changes in working directory) modified: test.txt no changes added to commit (use "git add" and/or "git commit -a") 第一行会告诉我们当前在哪个分支(branch) 第二行告诉我们工作区的修改没有添加到仓库的暂存区 括号中告诉我们, 使用 git add 来将修改添加到暂存区, 使用 git restore 来将工作区的修改取消 标红的字告诉我们哪些文件被修改了 最后一行告诉我们暂存区内没有添加新的修改 建议经常使用 git status 检查 # 8. 查看工作区中的文件修改了哪些内容 git diff 说明: 将会以unix通用的diff格式显示文件中的哪些地方被修改。 # 9. 将修改后的文件添加到仓库的暂存区并提交到仓库, 再查看当前仓库的状态 git add test.txt git commit -m "add 4" git status 看看输出: On branch master nothing to commit, working tree clean 工作区和暂存区和仓库都同步了。 要随时掌握工作区的状态, 使用git status命令。 如果git status告诉你有文件被修改过, 用git diff可以查看修改内容。 # 10. 实践: (1) 创建 test.txt, 在里面写入以下内容: 1 2 将 test.txt 提交到本地仓库, describe "1 and 2" (2) 在 test.txt 中添加一行 4, 提交到本地仓库, "add 4" (3) 在 test.txt 中将 4 修改为 3, 提交到本地仓库, "4 to 3" # 11. 查看提交记录 git log git log --pretty=oneline 说明: 前面的大串数字是16进制版本号, 后面跟的是每次提交的说明, 所以每次提交一定要认真写说明 # 12. 版本回退 (1) 回到之前的版本 git reset --hard HEAD^ (2) 回到上两个版本 git reset --hard HEAD^^ (3) 回到上三个版本 git reset --hard HEAD~3 (4) 回到指定版本 git reset --hard # 13. 查看最近的操作记录 git reflog git log 查看此时的提交历史, 发现之后的版本消失了 想要恢复到"4 to 3"版本, 可以查看操作记录 之后用 commit id 回到未来 说明: (1) HEAD指向的版本就是当前版本, 因此, Git允许我们在版本的历史之间穿梭, 使用命令git reset --hard commit_id (2) 穿梭前, 用git log可以查看提交历史, 以便确定要回退到哪个版本 (3) 要重返未来, 用git reflog查看命令历史, 以便确定要回到未来的哪个版本 # 14. 关于撤销修改 (1) 没有添加到暂存区, 想直接丢弃工作区的修改 git restore git checkout -- (2) 修改后的文件已经添加到暂存库, 丢弃暂存库中的修改 git restore --staged git reset HEAD (3) 修改已经提交到版本库, 酌情回退 git reset --hard HEAD^ 其余参见第 12 条版本回退 # 15. 删除文件 (1) 将文件从版本库删除: git add/rm git commit -m "deleted " (2) 撤销工作区的删除操作: git restore /git checkout -- 新建 delete_it.txt, 内容随便写, 提交到版本库 删除 delete.txt, 用 git status 查看状态 看一下输出: On branch master Changes not staged for commit: (use "git add/rm ..." to update what will be committed) (use "git restore ..." to discard changes in working directory) deleted: delete_it.txt no changes added to commit (use "git add" and/or "git commit -a") 藕, 跟之前不一样了, 之前是modified, 现在是deleted. 可以用本条介绍的语句来完成想做的操作。 # 16. 与 GitHub/gitee 建立 ssh 链接 (1) 创建 SSH Key, 如果之前用过 ssh 的同学应该可以在用户主目录下找到.ssh 文件夹, 更进一步也会有秘钥对。如果没有, 打开 shell 输入: ssh-keygen -t rsa -C "EmailAddress@heiheihei.com" 需要把邮件地址换成你自己的邮件地址, 然后一路回车, 使用默认值即可, 由于这个 Key 也不是用于军事目的, 所以也无需设置密码。 如果一切顺利的话, 可以在用户主目录里找到.ssh 目录, 里面有 id_rsa 和 id_rsa.pub 两个文件, 这两个就是 SSH Key 的秘钥对, id_rsa 是私钥, 不能泄露出去, id_rsa.pub 是公钥, 可以放心地告诉任何人。 (2) 在 GitHub 或者 gitee 的设置中添加 ssh 公钥, 详见 ppt 演示 允许添加多个 key, 对应有多台电脑或者多个系统的情况。 # 17. 添加远程仓库 将本地的仓库和远程仓库进行远程同步, 这样, 远程仓库既可以作为备份, 又可以让其他人通过该仓库来协作, 一举多得。 (1) 创建远程仓库, 详见 ppt 演示。 (2) 将本地仓库的内容推送到远程仓库, 在本地仓库下运行命令 git remote add git@github.com:/.git 或者用 gitee git remote add git@gitee.com:/.git 远程库的名字一般叫 origin, 这是 Git 默认的叫法, 也可以改成别的, 但是 origin 这个名字一看就知道是远程库。 (3) 将本地仓库的内容推送到远程仓库: git push -u origin master 把本地库的内容推送到远程, 用 git push 命令,实际上是把当前分支 master 推送到远程。 由于远程库是空的, 第一次推送 master 分支时, 加上了-u 参数, Git 不但会把本地的 master 分支内容推送的远程新的 master 分支, 还会把本地的 master 分支和远程的 master 分支关联起来, 在以后的推送或者拉取时就可以简化命令。 (4) 每次将修改提交到本地版本库后, 用如下命令把本地 master 分支的最新修改推送至远程仓库 git push origin master # SSH 警告: 当第一次使用Git的clone或者push命令连接网站时, 会得到一个警告: The authenticity of host 'gitee.com (xx.xx.xx.xx)' can't be established. RSA key fingerprint is xx.xx.xx.xx.xx. Are you sure you want to continue connecting (yes/no)? 这是因为Git使用SSH连接, 而SSH连接在第一次验证网站服务器的Key时, 需要你确认网站的Key的指纹信息是否真的来自网站的服务器, 输入yes回车即可。 Git会输出一个警告, 告诉你已经把网站的Key添加到本机的一个信任列表里了: Warning: Permanently added 'gitee.com' (RSA) to the list of known hosts. 这个警告只会出现一次, 后面的操作就不会有任何警告了。 如果实在担心有人冒充服务器, 输入yes前可以对照远程网站的RSA Key的指纹信息是否与SSH连接给出的一致。 # 解除与远程库的绑定关系 首先查看当前的远程库信息 git remote -v PRINT : origin git@gitee.com:Inorich/test_git.git (fetch) origin git@gitee.com:Inorich/test_git.git (push) 根据远程库名解除关联: git remote rm origin 实际上解除关联后网站上的远程库本身并没有任何改动。要真正删除远程库, 需要登录到网站, 在后台页面找到删除按钮再删除。 # 远程仓库总结: (1) 要关联一个远程库, 使用命令: git remote add / 关联一个远程库时必须给远程库指定一个名字, origin是默认习惯命名 (2) 第一次推送, 使用命令: git push -u 之后推送本地版本库的修改: git push Git本地仓库工作不需要联网, 当有网络的时候, 再把本地提交推送一下就完成了同步. # 18. 在 GitHub 或者 gitee 上愉快的拉代码 git clone 找到一个喜欢的开源项目 点击网页右上角的 fork, 在自己账号下 clone 一个仓库 然后从自己的账号下 clone 到本地 git clone Git 支持多种协议, 包括 https, 但 ssh 协议速度最快。 这样就可以把在本地做出的修改推送到开源项目中。如果希望官方仓库能够接受你的修改, 可以发起 pull request, 对方可以视心情而定是否接受你的修改。 # 19. Git 分支 (1) 创建分支 git branch (2) 查看分支 git branch 当前所在的分支将标注* (3) 切换分支 git switch git checkout (4)合并指定分支到当前分支 git merge 默认使用fast forward模式, 一般加 --no-ff 进行普通合并。由于普通合并后创建了一个新commit, 所以加上-m 描述。 git merge --no-ff -m "describe of this commit" (5)删除分支 git branch -d # 20. 分支合并冲突 创建新分支 newB, 在新分支将 test.txt 内容改为 1 2 3 4 并提交, 注释"777 to 4" 回到 master, 将 test.txt 内容改为 1 2 3 5 并提交, 注释"777 to 5", 此时执行 git merge newB 将会出错, 必须手动解决修改冲突后再行提交。完成后可以用如下命令查看图形: git log --graph --pretty=oneline --abbrev-commit # 21. 保存工作状态 现有 master 和 dev 两分支, 在 dev 上工作进行了一半未提交, 想转移到 master 分支, 可以用如下命令保存当前在 dev 分支上的工作状态: git stash 在 master 分支完成修改并提交后, 回到 dev 分支, 用如下命令查看之前保存的工作状态: git stash list 恢复之前的工作状态有以下两种方法: git stash apply , 恢复后 stash 的内容不删除, 仍保存在 stash list 中 git stash pop , 恢复的同时将保存的 stash 同时删除 如果刚才在 master 分支上做了修改, 想将修改复制到 dev 分支上, 先用 git log 看一下刚才的 commit_id, 再使用命令 git cherry-pick git 自动在 dev 分支上做了一次提交, 此次提交的修改和之前在 master 分支上的修改相同, 描述语句也相同。 # 22. 开发新功能时, 最好创建新的分支。如果要丢弃一个没有被合并过的分支, 可以通过如下命令强行删除: git branch -D # 23. 本地新建的分支如果不推送到远程, 对其他人就是不可见的。向远程仓库推送分支: git push # 24. 分支协作的流程: (1) 尝试推送自己的修改 git push (2) 如果推送失败, 则因为远程分支比你的本地更新, 需要先尝试合并 git pull 如果 git pull 提示 no tracking information, 则说明本地分支和远程分支的链接关系没有创建, 用命令 git branch --set-upstream-to / (3) 如果合并有冲突, 则解决冲突, 并在本地提交; (4) 没有冲突或者解决掉冲突后, 再推送 git push # 25. 标签操作 (1) 对一个分支上最新提交的 commit 打上标签, 注意不带双引号 git tag (2) 对指定 commit 打上标签 git tag (3) 查看所有标签 git tag (4) 查看特定标签信息 git show (5) 创建带有说明的标签 git tag -a -m "describe sentense" (6) 删除标签 git tag -d (7) 将标签推送到远程仓库 git push (8) 一次性推送所有未同步到远程的标签 git push --tags (9) 删除已经推送到远程仓库的标签, 先在本地删除, 再从远程删除 git tag -d git push :refs/tags/