日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

git add多个文件_Git之旅② - 子命令与设计哲学

發布時間:2025/3/19 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 git add多个文件_Git之旅② - 子命令与设计哲学 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如果有人讓你猜Git總共有多少子命令,你可能會在思索一番之后說:可能幾十個吧(雖然常用的不超過10個)。那么,當我告訴你大概有170多個時,你會是什么反應呢?

1. 所有Git子命令

Git版本號(這里所用版本號:2.22.0)

~ git version

git version 2.22.0

查看子命令的幾種方法

1.1 通過幫助信息

git help

git help -a // (顯示可用的子命令)

git help -g // (最常用的 Git 向導)

1.2 直接查看子命令

//Linux

ls -lF /usr/local/git/libexec/git-core | wc -l

//mac

ls -lF /usr/local/Cellar/git/2.22.0_1/libexec/git-core |wc -l

目前,2.22.0版本子命令數:170多個

git子命令

2. Git子命令

下圖中是常用的Git命令

git常用命令

2.1 幾個Git底層命令

  • 保存數據并生成sha-1字符
  • echo xxx | git hash-object -w --stdin
  • git hash-object filename
  • 查看對象類型
  • git cat-file -t sha1
  • 查看對象內容
  • git cat-file -p sha-1
  • 顯示暫存區目錄樹,第三個字段是暫存區編號
  • git ls-files -s(--stage)
  • 查看HEAD指向的目錄樹,-l參數顯示文件大小
  • git ls-tree -l -r -t HEAD
  • 查看打包的對象文件
  • git verify-pack -v .git/objects/pack/pack-xxxxxxxxxxxx.idx
  • 數據對象打包
  • git gc
  • 文件索引添加到暫存區
  • git update-index --add --cacheinfo 100644 9f358a4addefcab294b83e4282bfef1f9625a249b
  • 生成一棵樹(tree對象)
  • git write-tree
  • 生成commit對象,并指向一棵樹
  • echo "second commit " | git commit-tree 43e82 -p c760d78
  • 查看當前所有分支指向的版本號
  • git show-ref

2.2 剖析Git的3把刷子與1枚軍刀

3把刷子

ls //查看當前工作區

ls-files //查看當前暫存區

ls-tree //查看當前倉庫區

1枚瑞士軍刀

cat-file //查看git對象

3. 為什么這么多命令?

這要從兩方面分析:

  • 設計哲學
  • 源碼
  • 3.1 設計哲學角度

    linux

    一切皆文件

    單一目的的小程序

    組合小程序完成復雜任務

    文本文件保存配置信息

    ......

    git

    還是文件 (對象)

    子命令 (小程序)

    .gitconfig .gitignore (配置信息)

    ......

    Linux kernel與Git都來自同一人之手,所以你懂的...

    3.2 源碼角度

    static struct cmd_struct commands[] = {{ "add", cmd_add, RUN_SETUP | NEED_WORK_TREE },{ "am", cmd_am, RUN_SETUP | NEED_WORK_TREE },{ "annotate", cmd_annotate, RUN_SETUP | NO_PARSEOPT },{ "apply", cmd_apply, RUN_SETUP_GENTLY },{ "archive", cmd_archive, RUN_SETUP_GENTLY },{ "bisect--helper", cmd_bisect__helper, RUN_SETUP },{ "blame", cmd_blame, RUN_SETUP },{ "branch", cmd_branch, RUN_SETUP | DELAY_PAGER_CONFIG },{ "bundle", cmd_bundle, RUN_SETUP_GENTLY | NO_PARSEOPT },{ "cat-file", cmd_cat_file, RUN_SETUP },{ "check-attr", cmd_check_attr, RUN_SETUP },{ "check-ignore", cmd_check_ignore, RUN_SETUP | NEED_WORK_TREE },{ "check-mailmap", cmd_check_mailmap, RUN_SETUP },{ "check-ref-format", cmd_check_ref_format, NO_PARSEOPT },{ "checkout", cmd_checkout, RUN_SETUP | NEED_WORK_TREE },{ "checkout-index", cmd_checkout_index,RUN_SETUP | NEED_WORK_TREE},{ "cherry", cmd_cherry, RUN_SETUP },{ "cherry-pick", cmd_cherry_pick, RUN_SETUP | NEED_WORK_TREE },{ "clean", cmd_clean, RUN_SETUP | NEED_WORK_TREE },{ "clone", cmd_clone },{ "column", cmd_column, RUN_SETUP_GENTLY },{ "commit", cmd_commit, RUN_SETUP | NEED_WORK_TREE },{ "commit-graph", cmd_commit_graph, RUN_SETUP },{ "commit-tree", cmd_commit_tree, RUN_SETUP | NO_PARSEOPT },{ "config", cmd_config, RUN_SETUP_GENTLY | DELAY_PAGER_CONFIG },{ "count-objects", cmd_count_objects, RUN_SETUP },{ "credential", cmd_credential, RUN_SETUP_GENTLY | NO_PARSEOPT },{ "describe", cmd_describe, RUN_SETUP },{ "diff", cmd_diff, NO_PARSEOPT },{ "diff-files", cmd_diff_files, RUN_SETUP | NEED_WORK_TREE | NO_PARSEOPT },{ "diff-index", cmd_diff_index, RUN_SETUP | NO_PARSEOPT },{ "diff-tree", cmd_diff_tree, RUN_SETUP | NO_PARSEOPT },{ "difftool", cmd_difftool, RUN_SETUP_GENTLY },{ "env--helper", cmd_env__helper },{ "fast-export", cmd_fast_export, RUN_SETUP },{ "fetch", cmd_fetch, RUN_SETUP },{ "fetch-pack", cmd_fetch_pack, RUN_SETUP | NO_PARSEOPT },{ "fmt-merge-msg", cmd_fmt_merge_msg, RUN_SETUP },{ "for-each-ref", cmd_for_each_ref, RUN_SETUP },{ "format-patch", cmd_format_patch, RUN_SETUP },{ "fsck", cmd_fsck, RUN_SETUP },{ "fsck-objects", cmd_fsck, RUN_SETUP },{ "gc", cmd_gc, RUN_SETUP },{ "get-tar-commit-id", cmd_get_tar_commit_id, NO_PARSEOPT },{ "grep", cmd_grep, RUN_SETUP_GENTLY },{ "hash-object", cmd_hash_object },{ "help", cmd_help },{ "index-pack", cmd_index_pack, RUN_SETUP_GENTLY | NO_PARSEOPT },{ "init", cmd_init_db },{ "init-db", cmd_init_db },{ "interpret-trailers", cmd_interpret_trailers, RUN_SETUP_GENTLY },{ "log", cmd_log, RUN_SETUP },{ "ls-files", cmd_ls_files, RUN_SETUP },{ "ls-remote", cmd_ls_remote, RUN_SETUP_GENTLY },{ "ls-tree", cmd_ls_tree, RUN_SETUP },{ "mailinfo", cmd_mailinfo, RUN_SETUP_GENTLY | NO_PARSEOPT },{ "mailsplit", cmd_mailsplit, NO_PARSEOPT },{ "merge", cmd_merge, RUN_SETUP | NEED_WORK_TREE },{ "merge-base", cmd_merge_base, RUN_SETUP },{ "merge-file", cmd_merge_file, RUN_SETUP_GENTLY },{ "merge-index", cmd_merge_index, RUN_SETUP | NO_PARSEOPT },{ "merge-ours", cmd_merge_ours, RUN_SETUP | NO_PARSEOPT },{ "merge-recursive", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE | NO_PARSEOPT },{ "merge-recursive-ours", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE | NO_PARSEOPT },{ "merge-recursive-theirs", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE | NO_PARSEOPT },{ "merge-subtree", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE | NO_PARSEOPT },{ "merge-tree", cmd_merge_tree, RUN_SETUP | NO_PARSEOPT },{ "mktag", cmd_mktag, RUN_SETUP | NO_PARSEOPT },{ "mktree", cmd_mktree, RUN_SETUP },{ "multi-pack-index", cmd_multi_pack_index, RUN_SETUP_GENTLY },{ "mv", cmd_mv, RUN_SETUP | NEED_WORK_TREE },{ "name-rev", cmd_name_rev, RUN_SETUP },{ "notes", cmd_notes, RUN_SETUP },{ "pack-objects", cmd_pack_objects, RUN_SETUP },{ "pack-redundant", cmd_pack_redundant, RUN_SETUP | NO_PARSEOPT },{ "pack-refs", cmd_pack_refs, RUN_SETUP },{ "patch-id", cmd_patch_id, RUN_SETUP_GENTLY | NO_PARSEOPT },{ "pickaxe", cmd_blame, RUN_SETUP },{ "prune", cmd_prune, RUN_SETUP },{ "prune-packed", cmd_prune_packed, RUN_SETUP },{ "pull", cmd_pull, RUN_SETUP | NEED_WORK_TREE },{ "push", cmd_push, RUN_SETUP },{ "range-diff", cmd_range_diff, RUN_SETUP | USE_PAGER },{ "read-tree", cmd_read_tree, RUN_SETUP | SUPPORT_SUPER_PREFIX},{ "rebase", cmd_rebase, RUN_SETUP | NEED_WORK_TREE },{ "rebase--interactive", cmd_rebase__interactive, RUN_SETUP | NEED_WORK_TREE },{ "receive-pack", cmd_receive_pack },{ "reflog", cmd_reflog, RUN_SETUP },{ "remote", cmd_remote, RUN_SETUP },{ "remote-ext", cmd_remote_ext, NO_PARSEOPT },{ "remote-fd", cmd_remote_fd, NO_PARSEOPT },{ "repack", cmd_repack, RUN_SETUP },{ "replace", cmd_replace, RUN_SETUP },{ "rerere", cmd_rerere, RUN_SETUP },{ "reset", cmd_reset, RUN_SETUP },{ "restore", cmd_restore, RUN_SETUP | NEED_WORK_TREE },{ "rev-list", cmd_rev_list, RUN_SETUP | NO_PARSEOPT },{ "rev-parse", cmd_rev_parse, NO_PARSEOPT },{ "revert", cmd_revert, RUN_SETUP | NEED_WORK_TREE },{ "rm", cmd_rm, RUN_SETUP },{ "send-pack", cmd_send_pack, RUN_SETUP },{ "shortlog", cmd_shortlog, RUN_SETUP_GENTLY | USE_PAGER },{ "show", cmd_show, RUN_SETUP },{ "show-branch", cmd_show_branch, RUN_SETUP },{ "show-index", cmd_show_index },{ "show-ref", cmd_show_ref, RUN_SETUP },{ "stage", cmd_add, RUN_SETUP | NEED_WORK_TREE },/* * NEEDSWORK: Until the builtin stash is thoroughly robust and no * longer needs redirection to the stash shell script this is kept as * is, then should be changed to RUN_SETUP | NEED_WORK_TREE */{ "stash", cmd_stash },{ "status", cmd_status, RUN_SETUP | NEED_WORK_TREE },{ "stripspace", cmd_stripspace },{ "submodule--helper", cmd_submodule__helper, RUN_SETUP | SUPPORT_SUPER_PREFIX | NO_PARSEOPT },{ "switch", cmd_switch, RUN_SETUP | NEED_WORK_TREE },{ "symbolic-ref", cmd_symbolic_ref, RUN_SETUP },{ "tag", cmd_tag, RUN_SETUP | DELAY_PAGER_CONFIG },{ "unpack-file", cmd_unpack_file, RUN_SETUP | NO_PARSEOPT },{ "unpack-objects", cmd_unpack_objects, RUN_SETUP | NO_PARSEOPT },{ "update-index", cmd_update_index, RUN_SETUP },{ "update-ref", cmd_update_ref, RUN_SETUP },{ "update-server-info", cmd_update_server_info, RUN_SETUP },{ "upload-archive", cmd_upload_archive, NO_PARSEOPT },{ "upload-archive--writer", cmd_upload_archive_writer, NO_PARSEOPT },{ "upload-pack", cmd_upload_pack },{ "var", cmd_var, RUN_SETUP_GENTLY | NO_PARSEOPT },{ "verify-commit", cmd_verify_commit, RUN_SETUP },{ "verify-pack", cmd_verify_pack },{ "verify-tag", cmd_verify_tag, RUN_SETUP },{ "version", cmd_version },{ "whatchanged", cmd_whatchanged, RUN_SETUP },{ "worktree", cmd_worktree, RUN_SETUP | NO_PARSEOPT },{ "write-tree", cmd_write_tree, RUN_SETUP },};....int cmd_main(int argc, const char **argv){const char *cmd;int done_help = 0;cmd = argv[0];if (!cmd)cmd = "git-help";else {const char *slash = find_last_dir_sep(cmd);if (slash)cmd = slash + 1;}trace_command_performance(argv);/* * "git-xxxx" is the same as "git xxxx", but we obviously: * * - cannot take flags in between the "git" and the "xxxx". * - cannot execute it externally (since it would just do * the same thing over again) * * So we just directly call the builtin handler, and die if * that one cannot handle it. */if (skip_prefix(cmd, "git-", &cmd)) {argv[0] = cmd;handle_builtin(argc, argv);die(_("cannot handle %s as a builtin"), cmd);} ....

    可以看出來,但凡帶 "git-" 前綴的命令與去掉前綴作為git的子命令是一樣的。

    反應在代碼中,每一個命令又是一個單獨的文件存在。

    如此以來,復雜的git就化整為零,靠著眾多子命令單獨的功能,實現一個復雜的版本控制系統。

    看來,好的程序員必修的一門課,放在第一位的絕對是:哲學。

    總結

    以上是生活随笔為你收集整理的git add多个文件_Git之旅② - 子命令与设计哲学的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。